2008-11-21 27 views
5

Tôi đang sử dụng JSF/Facelets và tôi đang cố gắng lặp qua một số đối tượng Tài liệu (đối tượng tùy chỉnh) mà tôi đang lưu trong HashMap. Khi trang được tải, tôi nhận được lỗi "Tên thuộc tính" không tìm thấy trên loại java.util.HashMap $ Values ​​". Dưới đây là những gì trong đậu ủng hộ tôi:Lặp lại trên HashMap.values ​​() trong JSF + Facelets

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

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

Và trong trang xhtml của tôi:

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

Nếu tôi thay đổi getDocuments chức năng để điều sau đây, nó hoạt động (có nghĩa là bảng được hiển thị mà không có lỗi), nhưng Tôi không chắc tại sao tôi cần đặt các giá trị trong danh sách cho trang JSF/Facelets để hiển thị đúng.

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

Tôi không thể lặp qua Bộ sưu tập?

+2

Một bên, tôi nghĩ bạn chỉ có thể gọi: trả về ArrayList (document.values ​​()) mới – Josh

Trả lời

9

Vâng, khi nó quay ra, bạn không thể chỉ sử dụng bất kỳ loại bộ sưu tập nào với dataTable, và vì lý do chính đáng. Từ MyFaces 1.2 Spec, thuộc tính giá trị phải là:

Biểu thức EL chỉ định mô hình sao lưu bảng này.

Giá trị được tham chiếu bởi biểu thức EL có thể thuộc bất kỳ loại nào.

  • Giá trị của loại DataModel được sử dụng trực tiếp.
  • Thông số giống như mảng loại Object[], java.util.List, java.sql.ResultSet hoặc javax.servlet.jsp.jstl.sql.Result được bao bọc trong một DataModelthat tương ứng biết cách lặp qua các phần tử.
  • Các giá trị khác được bao bọc trong một DataModel dưới dạng một hàng.

Lưu ý đặc biệt rằng các bộ sưu tập không theo thứ tự, ví dụ: Set không được hỗ trợ. Do đó, nếu biểu thức giá trị tham chiếu đến một đối tượng như vậy thì bảng sẽ được coi là chỉ chứa một phần tử - chính bộ sưu tập đó.

Bộ sưu tập được trả về từ HashSet.values ​​() không được đặt hàng và do đó không được hỗ trợ. Nếu có, bạn sẽ không biết thứ tự các hàng trong bảng của bạn sẽ là gì, và việc làm mới trang có thể sắp xếp lại chúng một cách ngẫu nhiên. Không tốt.

Lỗi mà bạn nhận được là từ đoạn cuối, nó cho biết dữ liệu có thể xử lý Bộ sưu tập của bạn là đối tượng hàng và Bộ sưu tập không có thuộc tính "tên".

Các vấn đề liên quan