jsf - ¿Cómo UISelectOne y UISelectMany componentes preseleccionan los valores predeterminados en f: selectItems
jsf-2 primefaces (1)
Utiliza
Object#equals()
para eso.
Puede cambiar (corregir) este comportamiento al implementarlo en consecuencia en 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 olvides el
hashCode()
para satisfacer el
hashCode()
.
@Override
public int hashCode() {
return (id != null)
? (getClass().hashCode() + id.hashCode())
: super.hashCode();
}
Si no puede cambiar la entidad existente por alguna razón poco clara, 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 en el posible
error de validación: el valor no es un
problema
válido
.
Ver también:
Sé cómo preseleccionar
<p:selectOneMenu>
, en el
value
seleccionado debe ser uno de los objetos de
<f:selectItems>
, pero ¿cómo funciona este componente debajo del 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
<p:selectOneMenu>
difiere del objeto de
<f:selectItems>
y no lo reconoce.
Lo más probable es que cambie mi diseño para que apunte 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
<p:selectOneMenu>
que compare los objetos por
id
¿por ejemplo?
Pensé que ese
converter
responsable, pero cuando se
getAsObject
no entra en el método
getAsString
solo
getAsString
, así que supongo que hay algo diferente, pero ¿qué?
Gracias