我在流程中调用一个返回HashSet
Person
的方法。然后我使用Set
在我的xhtml文件中调用Primeface-dataTable
。现在我想显示该人的名字,但出现错误并说,他没有找到“prename”......
然后我将HashSet放在ArrayList
中并执行相同的操作。并且...它工作正常!但为什么呢?
设置和列表用作超级接口 Collection
& Iterable
。那么为什么这不适用于Set?
以下是文件的部分:
flow.xml
<view-state id="rcpm" view="rc/rcmembers.xhtml">
<on-entry>
<evaluate expression="RCHtmlCache.getCommunityList('rcpm')"
result="flowScope.members" />
</on-entry>
</view-state>
rcmembers.xhtml
<p:dataTable id="table1" var="member" value="#{members}"
sortMode="multiple" rowIndexVar="status"
emptyMessage="The Community is empty.">
<p:column>
<f:facet name="header">
<h:outputText value="Vorname" />
</f:facet>
<h:outputText value="#{member.vorname}" />
</p:column>
RCHtmlCache.java 设置版本
public Set<Person> getCommunity(String key) {
return htmlCache.get(key);
}
RCHtmlCache.java 列表版
public List<Person> getCommunityList(String key) {
Set<Person> comList = htmlCache.get(key);
ArrayList<Person> result = new ArrayList<Person>();
for (Person person : comList) {
result.add(person);
}
return result;
}
希望你能解释我这个奇怪的事件......
答案 0 :(得分:3)
这只是一个提示,但我认为PrimeFaces只接受List接口,因此你不能使用Set接口,它们不一样。
您可以使用适配器模式创建自己的List + Set Adapter类。它可能非常适合您的问题,因为您希望将Set接口调整为List接口。如果您这样做,那么您不需要每次都将您的Set转换为List
看看这个:http://en.wikipedia.org/wiki/Adapter_pattern
希望我能提供帮助。
答案 1 :(得分:2)
DataTable适用于DataModels ...而DataModels仅支持:
* java.util.List
* java.util.Object数组
* java.sql.ResultSet(因此也支持javax.sql.RowSet)
* javax.servlet.jsp.jstl.sql.Result
*任何其他Java对象都由具有单行的DataModel实例包装
(上述对象隐式用于构建DataModel)
参见JSF规范。