jsf-2 - EL 和协变返回类型

标签 jsf-2 el covariance

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

我可以使用

解决这个问题
  1. 泛型
  2. 将 setType 签名更改为 public void setType(UnitType type) 并检查 instanceof inside
  3. 更改方法名称以避免覆盖

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

最佳答案

似乎 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/

相关文章:

jsf-2 - 用于静态内容或普通静态文件的 JSF 库的性能?

java - JSF 不报告未定义的 bean

java - 调试器无法访问包含页面中的父页面变量

python - 计算协方差矩阵——numpy.cov 和 numpy.dot 之间的区别?

c++ - 对于迭代器和类似情况应该如何处理 'Invalid covariant return types'

scala - 为什么 Promise 不能是协变的

exception - org.apache.tomcat.dbcp.dbcp.SQLNestedException : Cannot get a connection, 池错误等待空闲对象超时

java - PDF 文件打不开

java - Spring Security : Custom Login without backing bean, 仅使用 spring security 配置作为 j_spring_security_check

eclipse - 摆脱打开 EL 表达式时生成的愚蠢的空间 eclipse