2013-10-24 3 views
6

Ich habe von Java EE 6 auf Java EE 7 migriert, und jetzt mit JSF 2.2 scheint der Kontextparameter INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL nicht funktioniert. In JSF 2.1 habe ich es auf "true" gesetzt und es funktioniert einwandfrei, aber jetzt bekomme ich immer leere Zeichenfolgen.JSF 2.2 interpretieren leere Zeichenfolge übermittelte Werte als Null funktioniert nicht

<context-param> 
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name> 
    <param-value>true</param-value> 
</context-param> 

Kann jemand etwas dazu sagen?

+0

Könnte ein Fehler in der Implementierung sein. Können Sie die Umgebung debuggen, um zu bestätigen, dass es sich um einen Fehler in den Mojarra-Quellen handelt? –

+1

mögliches Duplikat von [javax.faces.INTERPRET \ _EMPTY \ _STRING \ _SUBMITTED \ _VALUES \ _AS \ _NULL funktioniert nicht mehr seit Java EE 7/EL 3.0] (http://stackoverflow.com/questions/21880017/javax-faces -interpret-empty-string-submitted-values-als-null-does-not-work-anymor) – BalusC

Antwort

6

Das gleiche passiert mit Glassfish 4 mit dem neuesten Mojarra-2.2.5 sowie Wildfly 8 Final. . . Ich habe mehrere Fehlerberichte darüber gesehen, wie Manfried Riem sagt: "Es wurde festgestellt, dass dies ein EL-Problem ist und die EL-Implementierung wurde behoben, um dies zu beheben", aber nicht sicher, ob das Update von Mojarra das Problem behebt 4. Ich habe auch das el aktualisiert, und das hat auch nicht funktioniert.

+1

Ich löse dieses Problem endlich mit einem benutzerdefinierten Resolver wie im Link https://java.net/jira/browse/ gesagt JAVASERVERFACES_SPEC_PUBLIC-1203 Hoffe es hilft dir – onsm7

+0

Das hat 100% Dank funktioniert! – Sphynx

0

Die Dinge sind jetzt noch verwirrender. Ich verwende JSF 2.2.8-SNAPSHOT und obwohl der Wert während der JSF-Bean-Validierung als null interpretiert wird, ist der tatsächliche Wert ein leerer String. Dies bedeutet, dass andere Komponenten, die eine Validierung durchführen, z. JPA Fail Length Validierung als String Wert ist "".

Da dies offenbar eine spec change erfordert, würde ich das in absehbarer Zeit nicht erwarten. Die jira enthält auch eine Problemumgehung, die in dieser post beschrieben wird.

Ps. Dies könnte das richtige Verhalten sein, da documentation angibt, dass Null an das Bean-Validierungsframework übergeben wird, aber dies ist überhaupt nicht intuitiv.

1

Apache EL-Implementierung die leere Zeichenfolge (oder 0 Int-Wert). Sie können es in org.apache.el.parser.AstValue Klasse finden:

public void setValue(EvaluationContext ctx, Object value) 
     throws ELException { 
    Target t = getTarget(ctx); 
    ctx.setPropertyResolved(false); 
    ELResolver resolver = ctx.getELResolver(); 

    // coerce to the expected type 
    Class<?> targetClass = resolver.getType(ctx, t.base, t.property); 
    if (COERCE_TO_ZERO == true 
      || !isAssignable(value, targetClass)) { 
     resolver.setValue(ctx, t.base, t.property, 
       ELSupport.coerceToType(value, targetClass)); 
    } else { 
     resolver.setValue(ctx, t.base, t.property, value); 
    } 
    if (!ctx.isPropertyResolved()) { 
     throw new PropertyNotFoundException(MessageFactory.get(
       "error.resolver.unhandled", t.base, t.property));    
    } 
} 

Sie können COERCE_TO_ZERO auf false gesetzt (-Dorg.apache.el.parser.COERCE_TO_ZERO = false).

Oder nutzen Sie andere el impl:

<dependency> 
     <groupId>org.glassfish.web</groupId> 
     <artifactId>el-impl</artifactId> 
     <version>2.2</version>  
    </dependency> 

Und setzen context-param:

servletContext.setInitParameter("com.sun.faces.expressionFactory", "com.sun.el.ExpressionFactoryImpl"); 

Das el-api Seite war.

Andere Seite ist JSF.Sie müssen diesen Kontext-Parameter für JSF setzen:

servletContext.setInitParameter("javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL", "true"); 

Entschuldigung für mein Englisch!

-1

Ich habe unten versucht und hat gearbeitet. wir müssen diesen Eintrag unter web.xml hinzufügen

<context-param> 
    <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name> 
    <param-value>true</param-value> 
</context-param> 
Verwandte Themen