2012-07-25 21 views
8

Estoy trabajando con JSF 2.0, JBoss 7.1.1 Final y tengo el siguiente problema con selectOneMenu. Quiero ser capaz de establecer un campo en un bean administrado en verdadero/falso/nulo. Por lo tanto, he creado siguiendo selectOneMenu:h: selectOneMenu con elementos booleanos no funciona con valor nulo

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

Ahora, si decido 'Cualquier ..', se le asignará "falso" al campo registrationComplete (que es de Boole). Por lo tanto, null se interpreta como falso. También traté de utilizar valores booleanos en el selectItem (s), es decir:

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

Y también convertidor de caras-config registrados de la siguiente manera:

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

y trataron de 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> 

Pero todos estos intentos dieron como resultado el mismo comportamiento: cuando se seleccionó el valor nulo, se interpretó como falso.

Lo depuré y en el seguimiento de la pila encontré la ubicación donde ocurre. En AstValue.setValue(EvaluationContext, Object) line: 204

que llama

ELSupport.coerceToType(value, targetClass) 

parámetro valor es nulo y es targetClass de Boole. Este método coerceToType devuelve falso.

¿Alguna idea de cómo resolver este problema? ¡Gracias!

+0

¿Cuál es la firma del método() setRegistrationComplete? ¿Cuál es el tipo de argumento? Booleano o booleano? – prageeth

+0

@prageeth: OP declaró claramente 'Boolean'. – BalusC

+0

@prageeth es público void setRegistrationComplete (Boolean registrationComplete). Y el registro de campo completo es booleano – lukas

Respuesta

8

Esto es típico del analizador Apache EL que es utilizado por Tomcat y JBoss. Se sabe que no distingue entre primitivas y sus representaciones de objetos de envoltura al forzar valores de null en EL. Los tipos de envoltura siempre se tratan como primitivos. Funciona bien en Glassfish, por ejemplo.

Puede desactivar este comportamiento analizador Apache EL añadiendo el siguiente argumento VM a su script de inicio del servidor:

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