2011-04-18 32 views
10

Si una propiedad de objeto se declara como de tipo Boolean (no booleana primitiva), parece que hay un problema en EL al reconocerla.No se puede leer la propiedad booleana en JSP EL

Digamos que tiene el siguiente objeto

class Case{ 
    private Boolean valid; 

    public Boolean isValid(){ 
     return this.valid; 
    } 

    public void setValid(Boolean val){ 
     this.valid = val; 
    } 
} 

parece si ponemos un objeto del tipo de caso en la solicitud bajo el nombre de "caso", luego de que este intento en el JSP:

<td>Object is ${case.valid ? "Valid":"Invalid"} </td> 

Esto me da error "válido" no es una propiedad del objeto Case! ¡Si cambio válido de booleano a booleano primitivo, funciona!

¿Es este un problema conocido con los tipos booleanos en EL que no se reconocen como booleanos sino como objetos "normales" de Java? ¿Cuál es la forma correcta de manejar esto?

Gracias

+0

Soy un usuario JSP novato, pero ¿no sería 'privado' en su declaración de variable de objeto' válida' que significa que no puede acceder a él directamente? –

+0

Sí, esto es cierto en el mundo de Java, pero con EL puede acceder a las propiedades del objeto utilizando el estilo JavaBean (object.propertyName) siempre que haya proporcionado un getter (en este caso, isValid). Entonces, cuando dices case.valid, en realidad estás llamando a case.isValid(). Puedes ver que si cambio Boolean a boolean funciona bien. – DhafirNz

+0

Entonces, si llama al método 'isValid()', ¿no funciona tan bien? –

Respuesta

18

Todos los ejemplos que he visto hablar sobre boolean propiedades que permiten captadores de forma isProperty() además de getProperty() y nunca Boolean s.

No puedo encontrar ninguna referencia 'oficial' de este comportamiento, pero this blog post parece describir lo que sospechaba cuando me comentó inicialmente - un Boolean es un objeto mientras que un boolean es una primitiva y mientras Java tiene auto-boxing, EL Ignorará el getter isProperty() que devuelve un Boolean y, en su lugar, buscará un método getProperty().

por lo que sospecho que, en su ejemplo, si ha cambiado el tipo de retorno de isValid() a boolean en lugar de Boolean (pero deja el tipo del campo como Boolean), su expresión EL funcionará como se espera.

+2

La publicación del blog no existe. –

2

EL trata Boolean como un objeto (que es totalmente correcto) por lo que busca el método getValid(). Esto es consistente con la especificación JavaBeans.

Intente cambiar su propiedad de Boolean tipo de referencia a boolean tipo primitivo. Si esto no es posible y está utilizando un EL nuevo (es decir, 2.2 - No estoy seguro acerca de 2.1), puede invocar un método, por lo que ${case.isValid()} sería un ejemplo del uso correcto de esta nueva característica EL.

Cuestiones relacionadas