JSF 2.0: selectOneMenu tiene el valor predeterminado 0 cuando está vacío
Para mi proyecto quiero implementar un cuadro combinado conh: selectOneMenu. Leí muchas publicaciones sobre cómo manejar el selectOneMenu correctamente y cómo implementar un convertidor personalizado. El cuadro combinado almacenará la ID Larg) de una tabla de base de datos diferente (denominada fk_ID) para la que existe una restricción. Hasta ahora todo parece funcionar según lo planeado. Ahora a mi problema:
La columna fk_ID es opcional, por lo que la primera opción en el cuadro combinado es unaf: selectItem sin ningún valor etiquetado "elegir ...". Cuando guardo el formulario y cambio el valor, todo está bien, excepto si lo vuelvo a configurar en "elegir ...". El error que obtengo es un violación de integridad de restricción.
ambién encontré el problema: el convertidor devuelvenul según lo previsto, pero el bean recibe elLong 0.
The XHTML:
<h:selectOneMenu value="#{userBean.selectedModel.fk_id}"
id="combobox">
<f:selectItem itemLabel="choose ..." />
<f:selectItems
value="#{userBean.items}"
var="item"
itemLabel="#{item.value}"
itemValue="#{item.id}"
/>
<f:converter converterId="userConverter" />
</h:selectOneMenu>
El convertidor personalizado:
@FacesConverter(value = "userConverter")
public class UserConverter implements Converter {
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
if (arg2 != null && !arg2.equals("null"))
return Long.valueOf(arg2);
return null;
}
@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
return String.valueOf(arg2);
}
}
The bean (versión muy corta):
@Named(value = "userBean")
public class UserController implements Serializable {
@Getter
@Setter
private UserModel selectedModel;
@Getter
@Setter
private List<UserModel> items;
public void saveModel() {
selectedModel = userService.saveModel(selectedModel);
}
}
l problema es que el fk_id esLong 0, pero debería sernul. Puedo resolver el problema escribiendo
if (selectedModel.getFk_id() == 0)
selectedModel.setFk_id(null);
, pero esa no es una solución con la que me sienta cómodo.
Mi pregunta: ¿Por qué el valor esnul, que devuelve el convertidor, laLong 0 dentro desaveModel () método?