2012-07-25 5 views
8

Sto lavorando con JSF 2.0, JBoss 7.1.1 Finale e ho il seguente problema con selectOneMenu. Voglio essere in grado di impostare un campo in un bean gestito su true/false/null. Così, ho creato seguente selectOneMenu:h: selectOneMenu con elementi booleani non funziona con valore nullo

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

Ora, se scelgo di 'Qualsiasi ..', si assegna "false" per il campo registrationComplete (che è booleano). Quindi il valore viene interpretato come falso. Ho anche cercato di utilizzare i valori booleani nella selectItem (s), vale a dire:

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

E ho anche convertitore in faces-config registrati come segue:

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

e ha cercato di usarlo:

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

Ma tutti questi tentativi hanno comportato lo stesso comportamento - quando il valore nullo è stato selezionato, è stato interpretato come falso.

Ho eseguito il debug e nella traccia dello stack ho trovato il luogo in cui si verifica. In AstValue.setValue(EvaluationContext, Object) line: 204

chiama

ELSupport.coerceToType(value, targetClass) 

parametro valore è nullo e targetClass è booleana. Questo metodo coerceToType restituisce quindi false.

Qualche idea su come risolvere questo problema? Grazie!

+0

Qual è la firma del metodo() setRegistrationComplete? Qual è il tipo di argomento? Booleano o booleano? – prageeth

+0

@prageeth: OP ha dichiarato chiaramente 'Boolean'. – BalusC

+0

@prageeth è vuoto pubblico setRegistrationComplete (Boolean registrationComplete). E la registrazione del campo Completa è Boolean – lukas

risposta

8

Questo è tipico del parser Apache EL utilizzato da Tomcat e JBoss. È noto che non è possibile distinguere tra le primitive e le relative rappresentazioni degli oggetti wrapper durante la coercizione dei valori null in EL. I tipi di wrapper sono sempre trattati come primitivi. Ad esempio, funziona bene in Glassfish.

È possibile disattivare questo comportamento parser Apache EL aggiungendo il seguente argomento VM per lo script di avvio del server:

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