【问题标题】:Calling superclass getter method directly instead of property throws javax.el.MethodNotFoundException直接调用超类 getter 方法而不是属性抛出 javax.el.MethodNotFoundException
【发布时间】:2015-10-01 10:52:06
【问题描述】:

在 WildFly9 中,我们使用 Spring Data,我们有一个 JSP,其工作代码如下(页面类型为 PageImpl):

${page.first}
${page.last}
${page.isLast()}

但是这条线不起作用:

${page.isFirst()}

我们得到 javax.el.MethodNotFoundException

这是一个错误还是我错过了 EL 文档中的某些内容?

我缩小了问题范围:我们尝试在此对象上调用“桥接方法”,而应用服务器无法看到桥接方法。我在这个来源中找到了这个:https://github.com/jboss/jboss-el-api_spec/blob/master/src/main/java/javax/el/Util.java

List<Wrapper> result = new ArrayList<>();
for (Method method : methods) {
  if (method.getName().equals(name) && !method.isBridge()) {
     result.add(new MethodWrapper(method));
  }
}

但我还是不明白为什么我们不能达到这个简单的方法。

【问题讨论】:

  • 变量名表明您正在尝试从集合中访问此方法,但我认为这只是一个坏名字?
  • 是的。这与集合无关。
  • 我认为它应该使用该语法,至少在较新的 JEE 版本中。也许更多的上下文会有所帮助?

标签: jsp el wildfly


【解决方案1】:

在 WildFly9 中,EL 方法的分辨率与之前的版本不同。从现在开始,我们无法使用桥接方法,因为它们被 WildFly 的方法解析器过滤掉了。

如果我们在项目中使用公共库,我们会比预期更频繁地遇到 Bridge 方法。最简单的情况是有一个带有公共方法的包私有类和一个公共类扩展它。在这种情况下,子类中会有一个桥接方法,我们无法在 WildFly9'-s EL 中访问此方法。

父类.java

class Parent {
    public String methodToCall() {
        return "value";
    }
}

Child.java

public class Child extends Parent {
}

JSP

${child.methodToCall()}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 2010-12-31
    相关资源
    最近更新 更多