Невозможно прочитать Boolean свойство в JSP EL

Если свойство объекта объявлено как тип 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! Если я изменяю значение valid из Boolean в примитивное логическое, это работает!

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

Спасибо

Ответ 1

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

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

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

Ответ 2

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

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