鉴于以下 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 final 在 Tomcat 8.0.3.0 上运行的项目中不起作用。
这应该与Spring无关。
enum
给出的(它的类文件)在 WEB-INF/classes
中可用应用程序构建文件夹下的文件夹。
很难找出问题的实际原因,因为没有抛出错误或异常。浏览器上的页面只是一片空白,在服务器端什么也看不到。
OmniFaces 版本为 1.7。
试一试 OmniFaces 1.8-SNAPSHOT但问题仍然存在。
部分答案:
当我更改 var
的值时,这有效<o:importConstants>
的属性来自 const
不同的东西如下。
<o:importConstants var="literal" type="util.IntegerConstants"/>
DATA_TABLE_PAGE_LINKS : #{literal.DATA_TABLE_PAGE_LINKS.value}
显然,值 const
似乎在某个地方被保留了,但这太难以置信了,因为同样的东西具有值 const
如上所述,在另一个应用程序中工作正常!
最佳答案
这与 EL 的关系比与 JSF/Spring/OmniFaces 的关系更大。 Tomcat 使用的 Apache EL 实现对于保留关键字确实非常严格。例如 #{bean.class.name}
(如打印 bean.getClass().getName()
)在 GlassFish 使用的 Oracle EL 实现中也是可能的,但不是在 Tomcat 使用的 Apache EL 实现中。您应该将其写成 #{bean['class'].name}
。 chapter 3.9 中列出的所有其他 Java 关键字的 Java Language specification未在 EL specification 的第 1.17 章中列出也被 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}
关于jsf - Spring/JSF 项目中的 OmniFaces 不检索枚举属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23507372/