¿Cómo preseleccionan los valores predeterminados de los componentes UISelectOne y UISelectMany en f: selectItems?

Sé cómo preseleccionar

, en el value seleccionado debe ser uno de los objetos de , pero ¿cómo funciona este componente bajo el capó y puedo cambiar este comportamiento?

En mi caso tengo un objeto duplicado, en realidad se trata de dos objetos con los mismos valores pero creados dos veces y el objeto seleccionado en

difiere del objeto de y no lo reconoce. Lo más probable es que cambie mi diseño, apuntará al mismo objeto, pero en caso de que no pueda hacerlo debido a un código heredado, etc., ¿cómo puedo cambiar el comportamiento de

que comparará los objetos por id ¿por ejemplo?

Pensé que el converter responsable de eso, pero cuando lo getAsObject no ingresó en el método getAsString solo getAsString , así que supongo que hay algo diferente, ¿pero qué?

Gracias

Utiliza Object#equals() para eso. Puede cambiar (corregir) este comportamiento implementándolo según su entidad.

 private Long id; @Override public boolean equals(Object other) { return (other != null && getClass() == other.getClass() && id != null) ? id.equals(getClass().cast(other).id) : (other == this); } 

No olvide el hashCode() para satisfacer el contrato equals-hashCode .

 @Override public int hashCode() { return (id != null) ? (getClass().hashCode() + id.hashCode()) : super.hashCode(); } 

Si no puede cambiar la entidad existente por algún motivo poco claro, envuélvala en su propio DTO.

El convertidor solo convierte entre la entidad y su representación de String única para su uso en la salida HTML y los parámetros de solicitud HTTP y, por lo tanto, no tiene influencia en la preselección. Solo tiene influencia sobre el posible error de validación: el valor no es un problema válido .

Ver también:

  • Cómo llenar las opciones de h: selectOneMenu de la base de datos?