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.