EL和协变返回类型



我有这些类

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),所以这是一个bug吗?

我可以使用 来解决这个问题。
    泛型
  1. 修改setType签名为public void setType(UnitType type),检查instanceof inside
  2. 更改方法名称以避免重写

是否有一个真正的解决方案,而不是变通?

似乎是java.beans.Introspector的责任。Java中有很多相关的bug: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测试)中得到了修复。

最新更新