OmniFaces在Spring / JSF项目中不检索枚举属性

时间:2014-05-07 01:51:11

标签: jsf tomcat el jsf-2.2 omnifaces

鉴于以下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>

1 个答案:

答案 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.9Java Language specification中列出的EL specification中列出的所有其他Java关键字({3}}中未列出的所有其他Java关键字被Apache EL实现阻止。 const确实在其中。

另外,建议用大写字母启动常量var。此约定允许更好地区分托管bean实例和EL范围中的常量引用。它还可以立即解决您的问题,因为Constconst不同。

<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}