鉴于以下enum
。
package util;
public enum IntegerConstants
{
DATA_TABLE_PAGE_LINKS(10);
private final int value;
private IntegerConstants(int con) {
this.value = con;
}
public int getValue() {
return value;
}
}
此处给出的常量应在XHTML页面上检索,如下所示。
<ui:composition template="/WEB-INF/admin_template/Template.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:o="http://omnifaces.org/ui">
<ui:define name="title">Test</ui:define>
<ui:define name="content">
<h:form id="form" prependId="true">
<o:importConstants var="const" type="util.IntegerConstants"/>
DATA_TABLE_PAGE_LINKS : #{const.DATA_TABLE_PAGE_LINKS.value}
</h:form>
</ui:define>
</ui:composition>
这适用于在GlassFish 4.0上运行JSF托管bean的企业应用程序。
然而,同样的事情在使用Spring(4.0 GA),JSF 2.2.6,PrimeFaces 5.0 final,PrimeFaces Extensions 2.0.0最终在Tomcat 8.0.3.0上运行的项目中不起作用。
这不应该与Spring有关。
在应用程序的构建文件夹下的enum
文件夹中,WEB-INF/classes
已提供(其类文件)。
很难找出问题的实际原因,因为不会抛出任何错误或异常。浏览器上的页面只留空,服务器终端上没有任何内容。
OmniFaces版本为1.7。
考虑一下OmniFaces 1.8-SNAPSHOT,但问题仍然存在。
部分答案:
当我将var
<o:importConstants>
的{{1}}属性的值从const
更改为不同的内容时,这很有效。
<o:importConstants var="literal" type="util.IntegerConstants"/>
DATA_TABLE_PAGE_LINKS : #{literal.DATA_TABLE_PAGE_LINKS.value}
显然,值const
似乎已被保留在某处,但这太难以置信,因为值const
的相同内容在上面提到的另一个应用程序中正常工作! / p>
答案 0 :(得分:2)
这与EL更相关,而不是与JSF / Spring / OmniFaces相关。 Tomcat使用的Apache EL实现对保留关键字确实相当严格。例如,在GlassFish中使用的Oracle EL实现中可以使用#{bean.class.name}
(如在print bean.getClass().getName()
中),但在Tomcat使用的Apache EL实现中则不行。你应该把它写成#{bean['class'].name}
。 chapter 3.9的Java Language specification中列出的EL specification中列出的所有其他Java关键字({3}}中未列出的所有其他Java关键字也被Apache EL实现阻止。 const
确实在其中。
另外,建议用大写字母启动常量var
。此约定允许更好地区分托管bean实例和EL范围中的常量引用。它还可以立即解决您的问题,因为Const
与const
不同。
<o:importConstants var="Const" type="util.IntegerConstants" />
DATA_TABLE_PAGE_LINKS : #{Const.DATA_TABLE_PAGE_LINKS.value}
或者只是重命名枚举,var
默认为Class#getSimpleName()
。
<o:importConstants type="util.Const" />
DATA_TABLE_PAGE_LINKS : #{Const.DATA_TABLE_PAGE_LINKS.value}