2012-07-25 25 views
8

Pracuję z JSF 2.0, JBoss 7.1.1 Final i mam następujący problem z selectOneMenu. Chcę móc ustawić pole w zarządzanym komponencie bean na wartość true/false/null. Tak więc stworzyłem po selectOneMenu:h: selectOneMenu z elementami logicznymi nie działa z wartością pustą

<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> 

Teraz, jeśli zdecyduję się 'Każdy ..', to przypisze "false" do pola registrationComplete (co jest logiczne). Tak więc null jest interpretowane jako fałszywe. Próbowałem również użyć wartości logicznych w selectItem (-ów), to jest:

<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> 

I ja również zarejestrowany konwerter w twarze-config następująco:

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

i starał się go używać:

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

Jednak wszystkie te próby spowodowały to samo zachowanie - po wybraniu wartości pustej, interpretowano ją jako fałszywą.

I debugowałem to iw śladzie stosu znalazłem miejsce, gdzie to się dzieje. W AstValue.setValue(EvaluationContext, Object) line: 204

nazywa to

ELSupport.coerceToType(value, targetClass) 

parametr wartość jest null i targetClass jest logiczna. Ta metoda coerceToType zwraca następnie wartość false.

Jakieś pomysły na rozwiązanie tego problemu? Dzięki!

+0

Co to jest podpis setRegistrationComplete metoda()? Jaki jest typ argumentu? Boolean lub boolean? – prageeth

+0

@prageeth: OP wyraźnie określił "Boolean". – BalusC

+0

@prageeth to public void setRegistrationComplete (Boolean registrationComplete). A pole registrationComplete to Boolean – lukas

Odpowiedz

8

Jest to typowe dla parserów Apache EL, z których korzystają Tomcat i JBoss. Wiadomo, że nie rozróżnia między prymitywami i reprezentacjami obiektów w opakowaniu, gdy wymusza wartości EL. Typy opakowania są zawsze traktowane jako prymitywy. Działa to na przykład w Glassfish.

Można wyłączyć ten Apache EL parsera zachowania poprzez dodanie następującego argumentu VM do skryptu startowego serwera:

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