tutorial jsf el jsf-2.2 tomcat8 tomee

jsf - tutorial - primefaces



Comportamiento de coerción de Tomcat 8, cadenas nulas incorrectamente configuradas como cadenas vacías (1)

Esto es un error en la especificación EL 3.0. Desde EL 3.0, como consecuencia de la corrección exagerada de la especificación 184 de la especificación JSP, se forzará la null a la cadena vacía antes de que se invoque la configuración del valor del modelo. Básicamente, javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL ya no tiene ningún efecto. Ver también JSF issue 3071 y EL spec issue 18 .

Básicamente, para resolver este problema, debe proporcionar una resolución EL personalizada, o reemplazar / actualizar la implementación EL (o simplemente todo el servidor, ya que es el que realmente proporciona EL de la caja) a una versión con la corrección de errores. El problema de Tomcat 57309 que vinculó no está relacionado con este problema particular de EL 3.0 de coerción innecesaria de cadena nula a cadena vacía, solo está relacionado con el desconocimiento de Tomcat de la resolución EL personalizada.

Puedes resolver este problema de dos maneras:

  1. Proporcione un resolver EL personalizado como a continuación. Asegúrese de utilizar Tomcat 8.0.16 o posterior, como se especifica en el informe de problemas de Tomcat que encontró.

    public class EmptyToNullStringELResolver extends ELResolver { @Override public Class<?> getCommonPropertyType(ELContext context, Object base) { return String.class; } @Override public Object convertToType(ELContext context, Object value, Class<?> targetType) { if (value == null && targetType == String.class) { context.setPropertyResolved(true); } return value; } @Override public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context, Object base) { return null; } @Override public Class<?> getType(ELContext context, Object base, Object property) { return null; } @Override public Object getValue(ELContext context, Object base, Object property) { return null; } @Override public boolean isReadOnly(ELContext context, Object base, Object property) { return true; } @Override public void setValue(ELContext context, Object base, Object property, Object value) { // NOOP. } }

    Para que se ejecute, regístrese como se muestra a continuación en faces-config.xml :

    <application> <el-resolver>com.example.EmptyToNullStringELResolver</el-resolver> </application>

  2. O bien, cambie a Oracle EL. Ya lo arreglaron en la versión 3.0.1 b05, que ha estado disponible desde el 7 de julio de 2014 (simplemente elija el más nuevo que sea 3.0.1-b08 a partir de hoy).

    Simplemente suelte el archivo javax.el.jar en /WEB-INF/lib y agregue el parámetro de contexto a continuación a web.xml para instruir a MyFaces a utilizar la implementación de Oracle EL en su lugar:

    <context-param> <param-name>org.apache.myfaces.EXPRESSION_FACTORY</param-name> <param-value>com.sun.el.ExpressionFactoryImpl</param-value> </context-param>

    En caso de que esté usando Mojarra, use param name com.sun.faces.expressionFactory .

Como me confundí momentáneamente también, escribí un blog para que todo salga bien: la locura de String vacía .

Ver también:

Acabo de migrar a Tomcat 8. Solía ​​trabajar con la propiedad del sistema org.apache.el.parser.COERCE_TO_ZERO=false por lo que las cadenas vacías, los números, los booleanos, etc. se tratan como null .

En Tomcat 8, EL 3.0, se supone que es el valor predeterminado, pero de hecho está convirtiendo cadena null cadena vacía "" en el lado JSF.

Se supone que es un error y se supone que debe corregirse, pero no puedo hacerlo funcionar en una instantánea TomEE (Tomcat 8.0.27.0, MyFaces 2.2.8).