我升级了 Java EE Web 应用程序以使用较新的 PrimeFaces 版本,突然在 PrimeFaces 命令链接的操作属性中调用重载 bean 方法不再起作用。我尝试使用 JSF 默认命令链接来测试它,但这个也不起作用。
方法签名如下:
public void updateA(B b);
public void updateA(A a);
它总是试图将 A 投射到 B。
更好奇,升级之前怎么用?
Class#getMethods()
数组的第一个方法,其名称(和参数数量)与 EL 方法调用匹配。是否每次都返回相同的方法取决于所使用的 JVM make/版本。也许您同时也进行了 Java SE 升级。 javadoc 甚至这样说:
返回的数组中的元素没有排序,也没有任何特定的顺序。
您不应依赖未指定的行为。给它们起一个不同的名字。
解决这个问题的方法是创建一个通用方法并在该方法内执行“路由”。我知道这可能并不理想,但您最终会在函数和 XHTML 页面中获得更少的配置。
if (A.class.isInstance(obj)) {
A o = (A) obj;
return method(o, highRes);
} else if (B.class.isInstance(obj)) {
B o = (B) obj;
return method(o, highRes);
} else if (C.class.isInstance(obj)) {
C o = (C) obj;
return method(o, highRes);
} else {
throw new FacesException("Unsupported Conversion: " + obj);
}
事实上,org.glassfish.javax.el jar 支持重载,而不是 com.sun.el,所以在您的项目中使用它:
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b08</version>
</dependency>
代替:
<dependency>
<groupId>com.sun</groupId>
<artifactId>el</artifactId>
<version>2.2.0</version>
</dependency>
(检查适合您项目的版本,以上只是示例)