我们正在考虑将我们相当大的Web应用程序(使用Primefaces,Mojarra 2.1,Jetty)从Sun JDK6 + Jetty 6切换到Oracle JDK7 + Jetty 9.大多数情况下这是无痛的,但似乎Java上的方法访问是不同的7。
当有一个具有两种方法的课时
public Object getValue(int _index) {...}
和
public Object getValue(String _name) {...}
并使用
#{myBean.getValue(index)}
将调用正确的方法(使用int
参数)并在Java 6下返回正确的值。但是,在Java 7中,它会默默地失败并且不会返回/打印任何内容。当我更改方法名称并在JSF文件中使用适当的名称时,访问将按预期工作。
为什么我只在Java 7上看到这个并且有一种方法可以恢复旧的行为(基本上,就像在Java代码中那样工作 - 根据参数的类使用正确的方法)?
答案 0 :(得分:1)
这不是特定于JSF / Mojarra,而是EL和reflection API。例如,在使用MyFaces时,你会遇到完全相同的问题。
您正面临Jetty使用的EL实现中的错误。在找到方法时,它确实没有考虑方法参数类型(就像EL函数的工作方式一样)。 Buggy EL实现将循环遍历Class#getDeclaredMethods()
并选择与名称匹配的第一个并忽略参数类型。您可以阅读Class#getDeclaredMethods()
javadoc,
...返回的数组中的元素没有排序,也没有任何特定的顺序。 ...
订单未完成。实际上,在幕后,它依赖于JVM make / version。这至少解释了切换JVM时的区别。
我建议升级正在使用的EL实现或重命名方法。