2015-07-13 46 views
-1

在WildFly9我们使用Spring的数据,我们有一个JSP与这样的工作代码(网页类型PageImpl):直接调用,而不是财产超的getter方法抛出javax.el.MethodNotFoundException

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

但这行不工作:

${page.isFirst()} 

我们得到javax.el.MethodNotFoundException

这是一个bug或者也许我已经从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)); 
    } 
} 

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

+1

变量名建议你正试图从一个集合来访问这个方法,但我相信它只是一个坏名字? –

+0

是的。这与收藏无关。 –

+0

我认为它应该适用于这种语法,至少在更新的JEE版本中。也许更多的上下文会帮助? – user140547

回答

0

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

如果我们在项目中使用公共图书馆,我们可以比我们预期的更频繁地满足Bridge方法。最简单的情况是有一个包含私有类的公共方法和一个公共类扩展了它。在这种情况下,子类中会有一个桥接方法,我们无法在WildFly9'-EL中使用这种方法。

Parent.java

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

Child.java

public class Child extends Parent { 
} 

JSP

${child.methodToCall()} 
相关问题