h: inputText que está vinculado a la propiedad String está enviando una cadena vacía en lugar de nula
jsf tomcat (2)
Espero que esta sea la forma correcta de decir que no puedo encontrar una solución para el problema.
He agregado el context-param
a mi web.xml
pero no tiene ningún resultado. Uso un servidor Tomcat 6.0.24 con estos dos context-param: javax.faces.PROJECT_STAGE =
Desarrollo javax.faces.VALIDATE_EMPTY_FIELDS = true
Tengo una aplicación JSF 2.0 en Tomcat con muchos campos <h:inputText>
para ingresar datos en mi base de datos. Algunos campos no son obligatorios.
<h:inputText value="#{registerBean.user.phoneNumber}" id="phoneNumber">
<f:validateLength maximum="20" />
</h:inputText>
Cuando el usuario deja este campo vacío, JSF establece una cadena vacía ""
lugar de null
.
¿Cómo puedo solucionar este comportamiento sin comprobar cada cadena con
if (string.equals("")) { string = null; }
Puede configurar JSF 2.x para interpretar los valores enviados vacíos como nulos por el siguiente context-param
en web.xml
(que tiene un nombre bastante largo, eso también será la razón por la que no pude recordarlo):
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
Para referencia y para quienes estén interesados, en JSF 1.2 (y, por lo tanto, no 1.1 o más antiguos porque no es posible tener un Converter
para java.lang.String
), esto se puede solucionar con el siguiente Converter
:
public class EmptyToNullStringConverter implements Converter {
public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) {
if (submittedValue == null || submittedValue.isEmpty()) {
if (component instanceof EditableValueHolder) {
((EditableValueHolder) component).setSubmittedValue(null);
}
return null;
}
return submittedValue;
}
public String getAsString(FacesContext facesContext, UIComponent component, Object modelValue) {
return (modelValue == null) ? "" : modelValue.toString();
}
}
... que debe registrarse en faces-config.xml
siguiente manera:
<converter>
<converter-for-class>java.lang.String</converter-for-class>
<converter-class>com.example.EmptyToNullStringConverter</converter-class>
</converter>
En caso de que todavía no esté en Java 6, reemplace submittedValue.empty()
por submittedValue.length() == 0
.