JSF EL调用静态方法的合规性及生效原因咨询
问题解答
1. 行为与EL规范描述的差异原因
你当前的调用方式并非EL规范定义的“静态方法直接调用”,而是通过CDI Bean实例间接触发了静态方法:
- EL规范中要求显式导入类才能调用的是
#{类名.静态方法()}这类语法(比如#{StaticMethods.doSomething()}),这才是EL层面的静态方法调用。 - 你实际使用的
#{staticMethods.doSomething()}里,staticMethods是@Named注解生成的CDI Bean实例名(默认规则为类名首字母小写)。EL先获取到这个CDI管理的Bean实例,再通过Java语法允许的“实例调用静态方法”特性,触发了doSomething()静态方法执行。这本质是实例调用语法的巧合,而非EL直接调用静态方法。
2. 调用生效与bean-discovery-mode="all"的关系
是的,这个配置是关键前提:
- 当
beans.xml设置bean-discovery-mode="all"时,CDI会自动发现并管理所有符合条件的类(包括带@Named注解的类),你的StaticMethods类因此被实例化为可用Bean,EL才能通过staticMethods这个名称获取到它的实例。 - 补充:若配置为
bean-discovery-mode="annotated",带@Named这类CDI注解的类同样会被发现,所以all模式不是唯一生效条件,但它确保了不会遗漏任何可能的Bean。
验证EL规范静态调用的方式
若想测试标准的EL静态方法调用,可按以下步骤操作:
- 在
faces-config.xml中添加类导入配置:
<application> <el-resolver> <static-class>你的包路径.StaticMethods</static-class> </el-resolver> </application>
- 在页面中使用
#{StaticMethods.doSomething()}调用,若能成功执行,才是符合EL规范的静态方法调用方式。
内容的提问来源于stack exchange,提问作者raho
相关产品推荐
相关产品推荐

