2008-11-21 6 views
5

Ich benutze JSF/Facelets, und ich versuche, über einige Document-Objekte (benutzerdefiniertes Objekt), die ich in einer HashMap behalte. Wenn die Seite geladen wird, erhalte ich den Fehler "Name der Eigenschaft 'wurde nicht gefunden bei Typ java.util.HashMap $ Values". Hier ist, was ist in meinem Backing Bean:Iterate über HashMap.values ​​() in JSF + Facelets

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

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

Und in meiner xhtml Seite:

<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> 

Wenn ich die GetDocuments Funktion der folgenden ändern, es funktioniert (dh die Tabelle ohne Fehler angezeigt wird), aber Ich bin mir nicht sicher, warum ich die Werte in die Liste setzen muss, damit die JSF/Facelets-Seite richtig angezeigt wird.

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

Sollte ich nicht in der Lage sein, über die Sammlung zu iterieren?

+2

Ein beiseite, ich denke, Sie können einfach anrufen: zurückgeben neue ArrayList (document.values ​​()) – Josh

Antwort

9

Nun, wie sich herausstellt, können Sie nicht einfach jede Art von Sammlungsart mit DataTable verwenden, und das aus gutem Grund. Vom MyFaces 1.2 Spec muss der Wert Attribut sein:

Ein EL-Ausdruck, der die Datenmodell gibt, die diese Tabelle sichert.

Der Wert, auf den der Ausdruck EL verweist, kann von einem beliebigen Typ sein.

  • Ein Wert vom Typ DataModel wird direkt verwendet.
  • Array-ähnliche Parameter vom Typ Object[], java.util.List, java.sql.ResultSet oder javax.servlet.jsp.jstl.sql.Result sind in einem entsprechenden DataModel verpackt, das weiß, wie man über die Elemente iteriert.
  • Andere Werte werden in einem DataModel als einzelne Zeile eingeschlossen.

Beachten Sie insbesondere, dass ungeordnete Sammlungen, z. B. Set, nicht unterstützt werden. Wenn der Wertausdruck auf ein solches Objekt verweist, wird daher davon ausgegangen, dass die Tabelle nur ein Element enthält - die Auflistung selbst.

Die von HashSet.values ​​() zurückgegebene Auflistung ist nicht geordnet und wird daher nicht unterstützt. Wenn dies der Fall wäre, hätten Sie keine Ahnung, in welcher Reihenfolge die Zeilen in Ihrer Tabelle ausgegeben würden, und die Aktualisierung der Seite könnte sie nach dem Zufallsprinzip neu ordnen. Nicht gut.

Der Fehler, den Sie bekommen, ist, vom letzten Absatz sagt, dass die Datentabelle Ihre Sammlung als Zeilenobjekt behandelt, und Sammlung hat keine "Name" -Eigenschaft.