带有 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
有什么问题,您也应该包括该代码。
我正在尝试循环遍历列表并使用 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
有什么问题,您也应该包括该代码。