3

我有这些课

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

我可以使用

  1. 仿制药
  2. 将 setType 签名更改为public void setType(UnitType type)并检查 instanceof 内部
  3. 更改方法名称以避免覆盖

有没有真正的解决方案而不是解决方法?

4

1 回答 1

1

好像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 进行了测试)。

于 2015-04-28T12:00:59.510 回答