【问题标题】:Mojarra JSF 2.1 fails to call correct method after upgrade to JDK7Mojarra JSF 2.1 升级到 JDK7 后无法调用正确的方法
【发布时间】:2013-06-18 10:09:48
【问题描述】:

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

【问题讨论】:

    标签: java jsf-2 java-7 mojarra


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-25
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 2016-04-20
      相关资源
      最近更新 更多