En un formulario gigante, para simplificar, se pueden usar directamente objetos en los h:selectOneMenu (como en este artículo >>) en JSF 2.

Sin embargo, luego de ‘submitir’ el formulario, nos encotramos con que se habrá perdido la referencia al objeto y el valor en el option del select será sólo el string que lo representa:

<select id="formulario:id" size="1" name="formulario:id">
<option selected="selected" value="">-Seleccionar-</option>
<option value="paquete.Clase@JHVBigs">Uno</option>
<option value="paquete.Clase@HaShRaro">Dos</option>
<option value="paquete.Clase@3.026dfSFsf">Tres</option>
<option value="paquete.Clase@64SFDccsfAD">Cuatro</option>
</select>

Como en este link de Balus C que ya he linkeado antes >> las opciones son o implementar un Converter, o utilizar un Map para alimentar el componente.

Dado que estoy picado con el hecho que el Key y el Value estén al revés de los cristianos al pasar el Map a HTML >>, me puse a investigar cómo es esto del Converter

Existe un tag de Seam <s:convertEntity /> que lo que hacía era la conversión con una query a la base de datos. Hacía porque ésto era en Seam 2, en Seam 3 ya fue deprecado (como muchas otras cosas). Ahora hay que implementar uno mismo la clase, lo cual no es malo porque, por ejemplo, podemos utilizar inyección:

@RequestScoped
@FacesConverter("nombreaAReferenciar")
public class MiConvertidor implements Converter {

@Inject
private BeanPrincipal bean;

@Override
public Object getAsObject(FacesContext contexto, UIComponent componente, String valor) {
for(MiObjeto o : this.bean.getMisObjetos()){
if(o.getCdg()==Integer.parseInt(valor)) return o; //así me ahorro la query
}
return null;
}

@Override
public String getAsString(FacesContext contexto, UIComponent componente, Object objeto) {
if(objeto!=null) return ((MiObjeto)objeto).getCdg().toString();
else return "";
}
}

Funciona ‘de lolo’ y así puedo enlazar directamente el select con la propiedad de mi objeto, sin necesidad de declarar una propiedad adicional en el bean y después setearla.

Para más info RTFM!
Este sitio utiliza cookies.    Leer más