EL支持重载方法吗?

问题描述 投票:0回答:3

我升级了 Java EE Web 应用程序以使用较新的 PrimeFaces 版本,突然在 PrimeFaces 命令链接的操作属性中调用重载 bean 方法不再起作用。我尝试使用 JSF 默认命令链接来测试它,但这个也不起作用。

方法签名如下:

public void updateA(B b);
public void updateA(A a);

它总是试图将 A 投射到 B。

更好奇,升级之前怎么用?

el overloading
3个回答
43
投票

EL不支持,不。它始终是

Class#getMethods()
数组的第一个方法,其名称(和参数数量)与 EL 方法调用匹配。是否每次都返回相同的方法取决于所使用的 JVM make/版本。也许您同时也进行了 Java SE 升级。 javadoc 甚至这样说:

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

您不应依赖未指定的行为。给它们起一个不同的名字。


4
投票

解决这个问题的方法是创建一个通用方法并在该方法内执行“路由”。我知道这可能并不理想,但您最终会在函数和 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);
}

0
投票

事实上,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>

(检查适合您项目的版本,以上只是示例)

© www.soinside.com 2019 - 2024. All rights reserved.