2012-07-25 7 views
8

Ich arbeite mit JSF 2.0, JBoss 7.1.1 Final und ich habe folgendes Problem mit selectOneMenu. Ich möchte in der Lage sein, ein Feld in einer verwalteten Bean auf true/false/null zu setzen. So habe ich folgende selectOneMenu erstellt:h: selectOneMenu mit booleschen Elementen funktioniert nicht mit Nullwert

<h:selectOneMenu value="#{personList.criteria.registrationComplete}" > 
    <f:selectItem itemValue="#{null}" itemLabel="Any.." /> 
    <f:selectItem itemValue="true" itemLabel="Yes"/> 
    <f:selectItem itemValue="false" itemLabel="No"/> 
</h:selectOneMenu> 

Jetzt, Wenn ich wählen ‚Beliebige ..‘ zu, wird es „falsch“ auf die registrationComplete Feld zuordnen (die Boolean). So wird null als falsch interpretiert. Ich habe auch versucht Boolesche Werte in der selectItem (s) zu verwenden, das heißt:

<h:selectOneMenu value="#{personList.criteria.registrationComplete}" > 
    <f:selectItem itemValue="#{null}" itemLabel="Any.." /> 
    <f:selectItem itemValue="#{true}" itemLabel="Yes"/> 
    <f:selectItem itemValue="#{false}" itemLabel="No"/> 
</h:selectOneMenu> 

Und ich auch Konverter in Gesichter-config registriert wie folgt:

<converter> 
    <converter-id>booleanConverter</converter-id> 
    <converter-class>javax.faces.convert.BooleanConverter</converter-class> 
</converter> 

und versuchte, es zu benutzen:

Aber alle diese Versuche führten zum gleichen Verhalten - , wenn der Nullwert ausgewählt wurde, wurde es als falsch interpretiert.

Ich debuggte es und in der Stack-Trace fand ich den Ort, wo es passiert. In AstValue.setValue(EvaluationContext, Object) line: 204

es nennt

ELSupport.coerceToType(value, targetClass) 

Wert Parameter ist null und target ist Boolean. Diese coerceToType-Methode gibt dann false zurück.

Irgendwelche Ideen, wie man dieses Problem löst? Vielen Dank!

+0

Was ist die Unterschrift des setRegistrationComplete() -Methode? Was ist der Typ des Arguments? Boolesch oder boolesch? – prageeth

+0

@frageeth: OP hat klar gesagt 'Boolean'. – BalusC

+0

@prageeth es ist öffentlich void setRegistrationComplete (Boolean registrationComplete). Und Feld registrationComplete ist Boolean – lukas

Antwort

8

Dies ist typisch für den Apache EL Parser, der von Tomcat und JBoss verwendet wird. Es ist bekannt, zwischen Primitiven und seinen Wrapper-Objektrepräsentationen nicht zu unterscheiden, wenn null Werte in EL erzwungen werden. Die Wrapper-Typen werden immer als Primitive behandelt. In Glassfish zum Beispiel funktioniert es gut.

Sie können dieses Apache EL-Parser Verhalten, indem Sie das folgende VM Argument zu Ihrem Server-Startskript deaktivieren:

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