2013-03-04 3 views
1

Я получаю вызов в потоке метода, который возвращает HashSet из Person назад. Затем я вызываю Set в свой файл xhtml с Primeface-dataTable. Теперь я хочу отобразить имя пользователя, но появляется ошибка и говорит, что он не нашел «prename» ...Почему Set does not работает в потоке веб-страниц и Primefaces

Затем я поместил 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.javaSet Версия

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

Итак, желаемая функциональность заключается в том, чтобы просто использовать код «Set» для отображения этого найденного значения ключа? – Walls

+0

Нет, код работает со списком. мой вопрос в том, почему он не будет работать с Set? Набор также повторяется, как список ... –

+0

См. Adam Winer (бывший JSF dev) в оригинальном обосновании: [Использует наборы с UIData] (http://sfjsf.blogspot.co.uk/2006/03/usings-sets -с-uidata.html). Короче говоря, 'UIData' был разработан для индексированных данных. – McDowell

ответ

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.

3

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

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

Взгляните на это: http://en.wikipedia.org/wiki/Adapter_pattern

Надежда Я мог бы помочь.