2008-11-21 8 views
5

Używam JSF/Facelets i próbuję iterować nad niektórymi obiektami Document (obiekt niestandardowy), które przechowuję w HashMap. Po wczytaniu strony otrzymuję komunikat o błędzie "Nazwa właściwości" nie została znaleziona w typie java.util.HashMap $ Values ​​". Oto co jest w moim podkładowej Fasola:Powtórz nad HashMap.values ​​() w JSF + Facelets

private Map<String, Document> documents = new HashMap<String, Document>(); 

public Collection<Document> getDocuments(){ 
    return documents.values(); 
} 

A w mojej strony xhtml:

<h:dataTable id="documentTable" 
    value="#{DocumentManager.allDocuments}" 
    var="doc" rowClasses="list-row-odd, list-row-even" 
    headerClass="table-header" styleClass="bordered"> 

    <h:column id="col_name"> 
     <f:facet name="header">Name</f:facet> 
     ${doc.name} 
    </h:column> 
</h:dataTable> 

Gdybym zmienić funkcję getDocuments do następujących, to działa (czyli tabela jest wyświetlany bez błędów), ale Nie jestem pewien, dlaczego muszę umieścić wartości na liście, aby strona JSF/Facelets była poprawnie wyświetlana.

public List<Document> getDocuments(){ 
    List<Document> rtrn = new ArrayList<Document>(); 
    for(Document doc : documents.values()) 
     rtrn.add(doc); 
    return rtrn; 
} 

Czy nie powinienem móc powtarzać kolekcji?

+2

Pomiń, myślę, że możesz po prostu zadzwonić: return new ArrayList (document.values ​​()) – Josh

Odpowiedz

9

Cóż, jak się okazuje, nie można po prostu użyć żadnego rodzaju kolekcji z DataTable i nie bez powodu. Z MyFaces 1.2 Spec atrybut wartość musi być:

Wyrażenie EL, który określa model danych, który tworzy kopie tej tabeli.

Wartość określona przez wyrażenie EL może być dowolnego typu.

  • Wartość typu DataModel jest używana bezpośrednio.
  • Parametry tablicowe typu , java.util.List, java.sql.ResultSet lub javax.servlet.jsp.jstl.sql.Result są zawijane w odpowiedni moduł DataModel, który potrafi iterować po elementach.
  • Pozostałe wartości są zawijane w DataModel jako pojedynczy wiersz.

Należy zwrócić uwagę w szczególności, że nieuporządkowane kolekcje, np. Set, nie są obsługiwane. Dlatego jeśli wyrażenie wartości odwołuje się do takiego obiektu, wówczas tabela będzie zawierała tylko jeden element - samą kolekcję.

Kolekcja zwrócona z HashSet.values ​​() nie jest uporządkowana i dlatego nie jest obsługiwana. Gdyby tak było, nie miałbyś pojęcia, w jakiej kolejności będą wyprowadzane wiersze w tabeli, a odświeżenia strony mogą losowo zamawiać je ponownie. Niedobrze.

Błąd, który otrzymujesz, z ostatniego akapitu mówi, że datatable traktuje twoją Collection jako obiekt wiersza, a Collection nie ma właściwości "name".