我们正在考虑将我们相当大的JDK7 (使用Primefaces,Mojarra2.1,Jetty)从Sun +Jetty6转换到Oracle +Jetty9,这在很大程度上是没有痛苦的,但在Java7上似乎方法访问是不同的。
当拥有包含这两个方法的类时
public Object getValue(int _index) {...}和
public Object getValue(String _name) {...}并使用
#{myBean.getValue(index)}在Java6中,它将调用正确的方法(带有int参数)并返回正确的值。然而,在Java7中,它将静默地失败,并且不会返回/打印任何内容。当我更改方法名并在JSF文件中使用适当的名称时,访问就会按预期工作。
为什么我只在Java 7上看到这一点,有没有一种方法可以恢复旧的行为(基本上,它的工作原理就像在Java代码中一样--基于参数的类使用正确的方法)?
发布于 2013-06-21 20:58:55
这并不是特定于JSF/Mojarra的,而是针对EL和reflection API的。例如,在使用MyFaces时,您会遇到完全相同的问题。
您在Jetty使用的EL实现中遇到了一个错误。在查找方法时,它显然没有考虑方法参数类型(与EL函数的工作方式完全相同)。Buggy EL实现将在Class#getDeclaredMethods()上循环,并选择第一个与名称匹配的参数类型,而忽略参数类型。正如您在Class#getDeclaredMethods() javadoc中所看到的,
...返回的数组中的元素不会排序,也不会按任何特定顺序排序。..。
顺序不明确。实际上,在幕后,它依赖于JVM的制造商/版本。这至少解释了切换JVM时的差异。
我建议升级正在使用的EL实现,或者重命名您的方法。
https://stackoverflow.com/questions/17232506
复制相似问题