升级到JDK7后,Mojarra JSF 2.1无法调用正确的方法

时间:2013-06-21 10:02:23

标签: java jsf-2 java-7 mojarra

我们正在考虑将我们相当大的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代码中那样工作 - 根据参数的类使用正确的方法)?

1 个答案:

答案 0 :(得分:1)

这不是特定于JSF / Mojarra,而是ELreflection API。例如,在使用MyFaces时,你会遇到完全相同的问题。

您正面临Jetty使用的EL实现中的错误。在找到方法时,它确实没有考虑方法参数类型(就像EL函数的工作方式一样)。 Buggy EL实现将循环遍历Class#getDeclaredMethods()并选择与名称匹配的第一个并忽略参数类型。您可以阅读Class#getDeclaredMethods() javadoc

  

...返回的数组中的元素没有排序,也没有任何特定的顺序。 ...

订单未完成。实际上,在幕后,它依赖于JVM make / version。这至少解释了切换JVM时的区别。

我建议升级正在使用的EL实现或重命名方法。