Невозможно прочитать 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.