jsf - Spring/JSF 项目中的 OmniFaces 不检索枚举属性

标签 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 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 范围内的常量引用。它还可以立即解决您的问题,因为 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}

关于jsf - Spring/JSF 项目中的 OmniFaces 不检索枚举属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23507372/

相关文章:

java - 如何在没有 CSR 的情况下在 Tomcat 中安装 GoDaddy SSL 证书?

jsp - JSTL/EL 中数字的上限

java - JSF ConvertNumber 抛出 java.lang.IllegalArgumentException : argument type mismatch Error

用于 bool 值的 JSF 或 PrimeFaces 组件/如何将 bool 值与 p :triStateCheckbox 一起使用

java - JSF 中的自刷新组件

java - 如何在不使用 eclipse 等的情况下在 tomcat 中运行 spring 应用程序

java - JSF 页面未在表单操作上重新加载

tomcat - Netbeans:启动 Tomcat 失败

java - 如何访问 JSP 中 servlet 设置的请求属性?

java - 连接 JSTL