Почему Set не работает в веб-потоке и Primefaces

Я получаю вызов в потоке метод, который возвращает HashSet из Person назад. Тогда я звоню Set в моем файле xhtml с Primeface-dataTable, Теперь я хочу, чтобы отобразить имя человека, но появляется ошибка и сказать, что он не нашел "имя"...

Затем я положил HashSet в ArrayList и сделай то же самое. И... все работает отлично! Но почему?
Set и List используют в качестве суперинтерфейсов 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 ответа

Решение

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.

Это просто подсказка, но я думаю, что PrimeFaces принимает только интерфейс List, поэтому вы не можете использовать интерфейс Set, они не одинаковы.

Вы можете создать свой собственный класс адаптера List + Set, используя шаблон адаптера. Это может очень хорошо соответствовать вашей проблеме, так как вы хотите адаптировать интерфейс Set к интерфейсу List. Если вы сделаете это, вам не нужно будет каждый раз конвертировать ваш Набор в Список.

Посмотрите на это: http://en.wikipedia.org/wiki/Adapter_pattern

Надеюсь, я смогу помочь.

Другие вопросы по тегам