我有这些类(class)
public abstract class Unit
{
public abstract UnitType getType();
...
}
public class Item extends Unit
{
protected ItemType type;
@Override
public ItemType getType()
{
return type;
}
public void setType(ItemType type)
{
this.type = type;
}
...
}
显然 ItemType
扩展了 UnitType
。
我得到:
javax.el.PropertyNotWritableException: /WEB-INF/facelets/general.xhtml @23,165 value="#{bean.item.type}": The class 'com.example.Item' does not have a writable property 'type'.
我可以理解协变返回类型会混淆 EL (2.2),所以这是一个错误吗?
我可以使用
解决这个问题- 泛型
- 将 setType 签名更改为
public void setType(UnitType type)
并检查 instanceof inside - 更改方法名称以避免覆盖
是否有真正的解决方案而不是解决方法?
最佳答案
似乎 java.beans.Introspector
负责。 Java 中有很多相关的错误:
7092744 , 7122138 , 6528714 , 6794807 , 6788525 .由于合成桥方法,协变返回类型和泛型会出现问题。对于某些 Java 7 更新(45、51、67、71),问题表现不正确,但在运行服务器一段时间后 - 这可能与 Introspector 和相关类中的软/弱引用缓存有关。
所有这些问题似乎都已在 Java 1.7.0_80 中修复(使用 Mojarra 2.2.8 和 Wildfly 8.2.0.Final 进行测试)。
关于jsf-2 - EL 和协变返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16039396/