带有CDI dataTable var的JSF为空

时间:2015-08-18 14:15:06

标签: jsf jsf-2 datatable cdi

我试图遍历列表并使用JSF dataTable打印出一些属性,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">
        <h:dataTable value="#{clubAdministrationController.members()}" var="member">
            <f:facet name="header">
                <h:outputText value="Leden" />
            </f:facet>
            <h:column>
                <f:facet name="header">
                    <h:outputText value="Voornaam" />
                </f:facet>
            <h:outputText value="#{member.firstName}"/>
            </h:column>
            <h:column>
                <f:facet name="header">
                    <h:outputText value="Achternaam" />
                </f:facet>
                <h:outputText value="#{member.lastName}"/>
            </h:column>
            <h:column>
                <h:outputLink id="bewerklid#{member.username}" value="bewerklid/#{member.username}">Wijzig</h:outputLink>
            </h:column>
        </h:dataTable>
</html>

我得到了这个结果:

<table>
  <thead>
    <tr>
      <th colspan="3" scope="colgroup">Leden</th></tr>
    <tr>
      <th scope="col">Voornaam</th>
      <th scope="col">Achternaam</th>
      <th scope="col"></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td></td>
      <td></td>
      <td><a id="j_idt12:0:bewerklid" name="j_idt12:0:bewerklid" href="bewerklid/">Wijzig</a></td>
    </tr>
    <tr>
      <td></td>
      <td></td>
      <td><a id="j_idt12:1:bewerklid" name="j_idt12:1:bewerklid" href="bewerklid/">Wijzig</a></td>
    </tr>
  </tbody>
</table>

dataTable迭代正确的时间,因为我有2个成员,但所有字段都是空的。 当我调试Java时,members()方法返回一个包含正确填充实例的列表,当我直接打印出值时,会打印正确的值。

#{clubAdministrationController.members().get(0).firstName} <!--displays values correctly  -->

当我打印出成员var的类名时,我得到会员$ Proxy $ _ $$ _ WeldClientProxy

#{member['class'].simpleName} <!-- prints Member$Proxy$_$$_WeldClientProxy -->

我认为这表明依赖注入出了问题。我使用CDI,我知道Weld是一个CDI实现,而且CDI并没有注入实际的类,而是一个代理类。我想一个代理类是实例化的,但字段必须以某种方式仍然从源实例复制。

我刚刚开始学习JSF和CDI,所以我的问题是&#34;我需要更改什么来使dataTable显示我的会员?&#34;

这是我的ClubAdministrationController,当我调试它时,列表中充满了我的两个成员:

@Named
@RequestScoped
public class ClubAdministrationController {
  @Inject
  private MemberDao memberDao;
  public List<Member> members() {
    List<Member> members = memberDao.getMembers();
    return members;
  }
}

1 个答案:

答案 0 :(得分:2)

由于member是Weld-Proxy,因此您似乎在某个地方拥有@Named 成员的类。 (隐式或显式)

您的数据表现在正在迭代正确的list(因此导致正确的行数),但总是引用一个没有正确值的命名类。最可能的是,您在Member.class上有一个注释,当您使用el-expression #{member}

时,会生成一个名为WeldProxy(为空)

(此表达式将胜过数据表var member

在这里,您要引用列表instance of member中的member()

#{clubAdministrationController.members().get(0).firstName} <!--displays values correctly  -->

在这里,您将引用指定的焊接代理#{member} - 正如class-attribute显示:

#{member['class'].simpleName} <!-- prints Member$Proxy$_$$_WeldClientProxy -->

var="member"更改为var="m"并使用m.firstName可以解决您的问题。

要告诉您Member.class的错误,您也应该包含该代码。