我试图遍历列表并使用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;
}
}
答案 0 :(得分:2)
由于member
是Weld-Proxy,因此您似乎在某个地方拥有@Named
成员的类。 (隐式或显式)
您的数据表现在正在迭代正确的list
(因此导致正确的行数),但总是引用一个没有正确值的命名类。最可能的是,您在Member.class
上有一个注释,当您使用el-expression #{member}
(此表达式将胜过数据表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
的错误,您也应该包含该代码。