Не удается прочитать логическое свойство в JSP EL - PullRequest
12 голосов
/ 18 апреля 2011

Если свойство объекта объявлено как тип Boolean (не примитивный логический), тогда, кажется, существует проблема в распознавании его EL!

Скажем, у вас есть следующий объект

class Case{
     private Boolean  valid;

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

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

Скажем, мы поместили объект типа Case в запрос под именем «case», затем я попробую это в JSP:

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

Это дает мне ошибку «valid» не является свойством объекта Case!Если я изменяю действительный с логического на примитивный логический, он работает!

Является ли это известной проблемой с логическими типами в EL, что они не распознаются как логические, но как "нормальные" объекты Java?Как правильно справиться с этим?

Спасибо

Ответы [ 2 ]

19 голосов
/ 18 апреля 2011

Все примеры, которые я когда-либо видел, говорят о boolean свойствах, которые допускают геттеры вида isProperty() в дополнение к getProperty() и никогда Boolean с.

Я не могу найтилюбая «официальная» ссылка на это поведение, но этот блог , кажется, описывает то, что я подозревал, когда я первоначально комментировал - Boolean - это объект, в то время как boolean - примитив, а в Java есть автобокс, EL будет игнорировать метод получения isProperty(), который возвращает Boolean, и вместо этого будет искать метод getProperty().

Так что я подозреваю, что в вашем примере, если вы изменили тип возвратаisValid() - boolean вместо Boolean (но оставьте тип поля Boolean), ваше выражение EL будет работать так, как вы ожидаете.

4 голосов
/ 20 апреля 2011

EL рассматривает Boolean как объект (что совершенно правильно), поэтому он ищет метод getValid(). Это соответствует спецификации JavaBeans.

Попробуйте изменить свойство с Boolean ссылочного типа на boolean примитивный тип. Если это невозможно, и вы используете новый EL (т.е. 2.2 - я не уверен насчет 2.1), вы можете вызвать метод, поэтому ${case.isValid()} будет примером правильного использования этой новой функции EL.

...