为什么Set在Web流和Primefaces中不起作用

时间:2013-03-04 15:06:30

标签: java jsf primefaces spring-webflow

我在流程中调用一个返回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;
}

希望你能解释我这个奇怪的事件......

2 个答案:

答案 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规范。