5

私は JSF/Facelets を使用しており、HashMap に保持しているいくつかの Document オブジェクト (カスタム オブジェクト) を反復処理しようとしています。ページがロードされると、「タイプ java.util.HashMap$Values にプロパティ 'name' が見つかりません」というエラーが表示されます。これが私のバッキングビーンの内容です:

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

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

そして私の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>

getDocuments 関数を次のように変更すると機能します (テーブルがエラーなしで表示されることを意味します) が、JSF/Facelets ページを正しく表示するために値をリストに入れる必要がある理由がわかりません。

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

コレクションを反復処理できないのでしょうか?

4

1 に答える 1

9

結局のところ、dataTable で任意の種類のコレクション型を使用することはできません。これには正当な理由があります。MyFaces 1.2 Specから、value 属性は次のようにする必要があります。

このテーブルを支えるデータ モデルを指定する EL 式。

EL 式によって参照される値は、任意の型にすることができます。

  • タイプ DataModel の値が直接使用されます。
  • Object[]タイプ、java.util.Listjava.sql.ResultSetまたはの配列のようなパラメータはjavax.servlet.jsp.jstl.sql.Result、要素を反復処理する方法を認識している対応する DataModel にラップされます。
  • その他の値は、単一の行として DataModel にラップされます。

特に、順序付けされていないコレクションSetなどはサポートされていないことに注意してください。したがって、値式がそのようなオブジェクトを参照する場合、テーブルには 1 つの要素 (コレクション自体) のみが含まれていると見なされます。

HashSet.values() から返される Collection は順序付けられていないため、サポートされていません。そうであれば、テーブル内の行が出力される順序がわからず、ページを更新するとランダムに並べ替えられる可能性があります。良くない。

あなたが得ているエラーは、最後の段落から、データテーブルがコレクションを行オブジェクトとして扱っており、コレクションに「名前」プロパティがないことを示しています。

于 2008-11-21T23:09:20.500 に答える