jsf-2 jboss6.x mojarra

Solución para INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL defectuoso en Mojarra JSF 2.1



jsf-2 jboss6.x (1)

Sé que hay una serie de publicaciones sobre la conversión de cadenas vacías a nulas en JSF2. La receta habitual es agregar lo siguiente a web.xml.

<context-param> <description>Does not appear to work</description> <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name> <param-value>true</param-value> </context-param>

Esto simplemente no parece funcionar, en absoluto. Luego creé un convertidor de cadenas personalizado para probar si eso funcionaría. Lo agregué explícitamente como un convertidor a mi inputText (de lo contrario, no se activará cuando esté en blanco).

Cuando INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL se establece en true, el convertidor recibe nulo y el colocador del texto de entrada sigue recibiendo "".

Cuando INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL se configura como falso (o como comentario) el convertidor recibe "" y el colocador para el texto de entrada recibe "" (incluso después de que el convertidor devuelve nulo).

@FacesConverter(forClass=java.lang.String.class, value="emptyStringToNull") public class StringConverter implements Converter, Serializable { private static final long serialVersionUID = -1121162636180944948L; public Object getAsObject(FacesContext context, UIComponent component, String value) { if (value == null || value.trim().isEmpty()) { return null; } return value; } public String getAsString(FacesContext context, UIComponent component, Object object) { if (object == null) return null; return object.toString(); } }

He intentado el evento (en vano) establecer explícitamente el valor enviado por el componente en getAsObject:

if (component instanceof EditableValueHolder) ((EditableValueHolder) component).setSubmittedValue(null);

Estoy usando JBoss6 (una instantánea de 6.1 realmente) y JSF 2.1.1.


Esto no es específico de Mojarra. Esto es específico de Tomcat (JBoss usa Tomcat como servletcontainer). Agregue el siguiente argumento de VM a las opciones de inicio.

-Dorg.apache.el.parser.COERCE_TO_ZERO=false

Según mi experiencia, este solo debería aplicarse en propiedades Number (int, long, etc.), sin embargo, dado que cierta versión tardía de Tomcat 6.0.x (al menos después de 6.0.20) parece estar rota también para cadenas y se basa en el argumento VM anterior.

En GlassFish 3.x, por ejemplo, funciona perfectamente bien en la caja.