0

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

4

1 回答 1

1

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

您在 Jetty 使用的 EL 实现中遇到了一个错误。在寻找方法时,它显然没有考虑方法参数类型(就像 EL 函数的工作方式一样)。Buggy EL 实现只会循环Class#getDeclaredMethods()并选择与名称匹配的第一个并忽略参数类型。正如您在Class#getDeclaredMethods()javadoc中所读到的,

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

订单未定义。实际上,在幕后,它依赖于 JVM 品牌/版本。这至少解释了切换 JVM 时的区别。

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

于 2013-06-21T12:58:55.013 回答