h:dataTable 未调用辅助 bean

h:dataTable backing bean not called

在 JSP 中,我使用了一个 h:dataTable 标记,其值设置为指向我的 getter 方法,后者又 returns 一个对象列表。问题是 getListSignataireExceptions 从未被调用并且 table 是空的。

请注意,AdministrationBean 已正确初始化,如果我将 #{administrationBean.listSignataireExceptions} 放在 table 标记之外,我将以非格式化方式在屏幕上获取对象列表。

同样适用于 #{administrationBean.message} - 没有消息,没有调用支持 bean。

JSP:

<div class="content">
    Administration des Exceptions signataires
    <h:dataTable id="table1" value="#{administrationBean.listSignataireExceptions}" var="item"
                 border="1">
        <f:facet name="header">
            <h:outputText value="Your Shopping Cart" />
        </f:facet>
        <h:column>
            <f:facet name="header">
                <h:outputText value="Item Description" />
            </f:facet>
            <h:outputText value="#{item.idSociete}" />
        </h:column>
        <h:column>
            <f:facet name="header">
                <h:outputText value="Price" />
            </f:facet>
            <h:outputText value="#{item.idAnnuaireSalarie}" />
        </h:column>
        <f:facet name="footer">
            <h:outputText value="Total: #{administrationBean.message}" />
        </f:facet>
    </h:dataTable>
</div>

支持 bean:

@Named
@SessionScoped
public class AdministrationBean implements Serializable {
    private static final long serialVersionUID = 1L;
    @Inject
    private AdministrationService service;

    public String getMessage(){
        return "test test";
    }

    public List<DtoSignataireException> getListSignataireExceptions(){
        return service.listSignatairesExceptions();
    }
}

问题与我们的 Java EE 容器 - WebSphere 8 有关。 正如下面问题中提到的,CDI 显然只适用于 WebSphere 中的默认 JSF 实现 - MyFaces。

CDI Bean not found from JSF page

我们的应用程序使用 Mojarra,因此 OpenWebBeans(WAS CDI 实现)不会使用 mojarra 创建的容器。

解决方案是添加 CDI 启用程序,如下文所述。这通过不同的容器桥接了 CDI。唯一的区别是在我的环境中,我不需要添加

<alternatives>
    <class>com.oracle.cdi_enabler.CdiConversation</class>
</alternatives>

https://weblogs.java.net/blog/mriem/archive/2013/12/10/jsf-tip-54-enable-cdi-when-bundling-jsf

另一种解决方案是在 faces-config 中声明所需的 EL 解析器,如下所示:

<application>
       <el-resolver>org.apache.webbeans.el.WebBeansELResolver</el-resolver>
  ..
<application>

您应该将 WebBeansELResolver 替换为 CDI 实现的 EL 解析器。在这种情况下,我们使用 WAS 容器提供的 OpenWeb Beans