带有 CDI dataTable var 的 JSF 为空

JSF with CDI dataTable var is empty

我正在尝试循环遍历列表并使用 JSF 数据表打印出一些属性,如下所示:

<?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() 方法 returns 一个包含正确填充实例的列表,当我直接打印出值时,打印出正确的值。

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

当我打印出成员变量的 class 名称时,我得到 Member$Proxy$_$$_WeldClientProxy

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

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

我刚开始学习JSF和CDI,所以我的问题是"what do I have to change to make the dataTable display my Members?"

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

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

由于 member 是一个 Weld-Proxy,您似乎在某处有一个 class 即 @Named member。 (隐式或显式)

您的数据 table 现在正在迭代正确的 list(因此产生正确的行数),但始终引用一个命名的 class,它没有适当的值。最有可能的是,当您使用 el 表达式 #{member}

时,您的 Member.class 上有一个特定的注释,然后会导致生成一个命名的 WeldProxy(它是空的)

(这个表达式将胜过数据table var member

在这里,您指的是列表 member() 中的 instance of member

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

此处您指的是命名的焊接代理 #{member} - 如 class- 属性所示:

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

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

为了告诉您 Member.class 有什么问题,您也应该包括该代码。