枚举属性不能被Spring / JSF项目中的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 final在Tomcat 8.0.3.0上运行的项目中不起作用。

这应该与Spring无关。

给出的enum(它的类文件)在应用程序构建文件夹下的WEB-INF/classes文件夹中可用。

很难找出问题的实际原因,因为没有抛出错误或异常。浏览器上的页面是空白的,在服务器终端上什么也看不见。

OmniFaces的版本是1.7。

在OmniFaces 1.8-SNAPSHOT上尝试了一下,但问题仍然是静止的。


部分答案:

当我将<o:importConstants>var属性的值从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())可能在Oracle EL实现中被GlassFish使用,但不可能在Apache EL实现中被Tomcat使用。您应该将其写成#{bean['class'].name}。Java语言规范第3.9章中列出的所有其他Java关键字,如果没有在EL规范第1.17章中列出,则也会被Apache EL实现屏蔽。const确实是其中之一。

另外,建议常量var以大写字母开头。该约定允许更好地区分EL范围内的托管bean实例和常量引用。它也立即解决你的问题,因为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}

相关内容

  • 没有找到相关文章

最新更新