2008-11-21 21 views
5

Estoy usando JSF/Facelets, y estoy tratando de iterar sobre algunos objetos de documento (objeto personalizado) que guardo en un HashMap. Cuando se carga la página, obtengo el error "Propiedad 'nombre' no encontrado en tipo java.util.HashMap $ Valores". Esto es lo que está en mi respaldo frijol:Iterar sobre HashMap.values ​​() en JSF + Facelets

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

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

Y en mi página 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> 

Si cambio la función getDocuments a la siguiente, que funciona (es decir, la tabla se muestra sin errores), pero No estoy seguro de por qué tengo que poner los valores en la lista para que la página JSF/Facelets se muestre correctamente.

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

¿No debería poder iterar sobre la colección?

+2

Aparte, creo que puede llamar: devolver nuevo ArrayList (document.values ​​()) – Josh

Respuesta

9

Bueno, como resultado, no se puede usar cualquier tipo de tipo de colección con dataTable, y por una buena razón. Desde el MyFaces 1.2 Spec, el atributo de valor debe ser:

una expresión EL que especifica el modelo de datos que respalda esta tabla.

El valor al que hace referencia la expresión EL puede ser de cualquier tipo.

  • Un valor de tipo DataModel se usa directamente.
  • Los parámetros tipo matriz del tipo Object[], java.util.List, java.sql.ResultSet o javax.servlet.jsp.jstl.sql.Result están envueltos en un DataModelt correspondiente que sabe cómo iterar sobre los elementos.
  • Otros valores se envuelven en un modelo de datos como una sola fila.

Tenga en cuenta en particular que las colecciones desordenadas, p. Ej. Set no son compatibles. Por lo tanto, si la expresión de valor hace referencia a dicho objeto, se considerará que la tabla contiene solo un elemento: la colección en sí misma.

La colección devuelta desde HashSet.values ​​() no está ordenada y, por lo tanto, no es compatible. Si lo fuera, no tendrías idea del orden en que saldrían las filas de tu tabla, y las actualizaciones de la página podrían reordenarlas al azar. No está bien.

El error que está recibiendo es que, desde el último párrafo, dice que la tabla de datos está tratando su Colección como el objeto de la fila, y la Colección no tiene una propiedad de "nombre".