2014-02-19 10 views
9
<context-param> 
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name> 
    <param-value>true</param-value> 
</context-param> 

Nicht in Verbindung mit dem neuesten Mojarra 2.2.5 sowohl auf Glasfischen 4 und Wildfly 8 Schlussjavax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL nicht mehr 7/EL da Java EE 3.0

Ich habe gesehen, mehrere Bug-Report arbeitete funktioniert Manfried Riem says, auf diesem,

Es wurde bestimmt dies ist ein EL Ausgabe und die EL-Implementierung hat behoben diese

zu beheben

Die Fix-Versionen sagt 2.2.5, und es ist auch in den Release-Notes von 2.2.5 angegeben, fehlt mir etwas?

+2

Nur für die Akten: Wildfly 8.1 hat immer noch dieses Problem. –

+0

Wildfly 8.2 scheint zu funktionieren –

Antwort

11

mit einem benutzerdefinierten Resolver Korrigiert:

faces-config.xml:

<application> 
    <el-resolver>my.package.EmptyNullStringResolver</el-resolver> 
</application> 

EmptyNullStringResolver.java:

/** 
* @author pg 
*/ 
public class EmptyNullStringResolver extends ELResolver { 

    @Override 
    public Class<?> getCommonPropertyType(ELContext context, Object base) { 
     return String.class; 
    } 

    @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) { 
    } 

    @Override 
    public Object convertToType(ELContext context, Object obj, Class<?> targetType) { 
     if (String.class.equals(targetType) && obj instanceof String && ((String) obj).trim().isEmpty()) { 
      context.setPropertyResolved(true); 
     } 
     return null; 
    } 
} 
+0

Verwendung der neuesten Glassfish 4.0.1 noch gebrochen – rekiem87

2

die falsche Bedingung Prüfung ist obj Beispielcodes. In der Update-Modellphase wird das Obj bei Null übergeben. Nachdem ich den unten stehenden Code richtig verstanden habe, funktioniert mein benutzerdefinierter ELResolver.

@Override 
public Object convertToType(final ELContext context, final Object obj, final Class<?> targetType) { 
    if (obj == null && String.class.equals(targetType)) { 
     context.setPropertyResolved(true); 
    } 
    return null; 
} 
4

ich mehrere Fehlerberichte zu diesem Thema, Manfried Riem says,

Es wurde bestimmt gesehen haben, ist eine EL-Emission und die EL-Implementierung behoben wurde diese

zu beheben

Die Fix-Versionen sagt 2.2.5, und es ist auch in den Release Notes von 2.2.5 angegeben, fehlt mir etwas?

Das eigentliche Update ist in EL, nicht in JSF. Die Mojarra-Version, die im Ausgabenbericht erwähnt wurde, war nur "konsensartig" die neueste Mojarra-Version in diesem Moment. Siehe auch The empty String madness.

Um dieses Problem zu lösen, müssen Sie die EL-Implementierung (oder einfach den ganzen Server, der EL aus der Box liefert) grundlegend verbessern. Im Falle von Oracle/Sun EL ist das Update in version 3.0.1 b05, die seit 7. Juli 2014 verfügbar ist (wählen Sie einfach die newest eine). Sie können nur die JAR in /WEB-INF/lib fallen und falls notwendig, die unter Konfiguration web.xml, falls Ihr Server wird mit einer anderen EL Implementierung als Oracle/Sun EL hinzufügen, die auch den gleichen Fehler macht:

<context-param>  
    <param-name>com.sun.faces.expressionFactory</param-name> 
    <param-value>com.sun.el.ExpressionFactoryImpl</param-value> 
</context-param> 

Oder Sie installieren eine alternative EL Implementierung, wie JUEL:

<context-param>  
    <param-name>com.sun.faces.expressionFactory</param-name> 
    <param-value>de.odysseus.el.ExpressionFactoryImpl</param-value> 
</context-param> 

Falls Sie sich MyFaces statt Mojarra verwenden <param-name> von org.apache.myfaces.EXPRESSION_FACTORY verwenden.

Zum Aktualisieren des Servers ist die EL-Version mit dem Fix mindestens in GlassFish 4.1 und WildFly 8.2 vorhanden.

+0

Hallo BalusC, das funktioniert nicht für mich. Ich bin mit Tomcat 8.0.28 und Maven org.glassfish javax.el 3.0.1-b05 kompilieren und immer noch nicht zum Download bereit. Ich konfiguriere die web.xml wie du es getan hast, aber nicht funktioniert. Ich bin wirklich dankbar, wenn Sie testen und mir helfen können, dieses Problem zu lösen. –

+0

@Diego: Es muss im Klassenpfad der Laufzeit enden. – BalusC

+0

Ich ändere den Bereich der Abhängigkeit zur Laufzeit, aber immer noch nicht funktioniert. –

0

Wir haben alle Oracle EL 2.2.2, 3.0.0, 3.0.1-b0X [1-8] und mit Apache Jasper EL 3.0 in Tomcat 7.0.xx oder Tomcat 8.0.30 mit oder ohne benutzerdefinierten ELResolver Wrapper mit getestet ELResolver fest @ faces-config.xml Ebene.

Das Ergebnis ist das gleiche. String MethodExpression null wird als leer interpretiert String ""

Aufruf von EL die folgenden Methoden mit t = null;

Kasten 1

public final void checkObject(Object t) 
... 
#{myBean.checkObject(null)} -> Receive null (OK) 

Kasten 2

public final void checkString(String t) 
... 
#{myBean.checkString(null)} -> Receive EMPTY String "" (NOT OK) 

Kasten 3

public final void checkDouble(double t) 
... 
#{myBean.checkDouble(null)} -> Receive 0.0 (OK) 

Fall 4

public final void checkBigDecimal(BigDecimal t) 
... 
#{myBean.checkBigDecimal(null)} -> Receive null (OK)