javax.el.PropertyNotFoundException при попытке разрешить логические свойства в EL

У меня есть следующий класс узла дерева:

public abstract class DocumentTreeNode extends TreeNodeImpl implements javax.swing.tree.TreeNode
{
    private Boolean isToC;

    ...

    public Boolean isToC()
    {
        return isToC;
    }

    public void setToC(Boolean isToC)
    {
        this.isToC = isToC;
    }

}

Это простой флажок, указывающий, должен ли документ быть включен во что-либо или нет. Однако при попытке сослаться на это из JSF 2 EL

...
<h:selectBooleanCheckbox value="#{node.isToC}" />
...

Я получаю исключение:

Причина: javax.el.PropertyNotFoundException: /main.xhtml @541,64 value="#{node.isToC}": Класс "ChapterTreeNode" не имеет свойства "isToC".

(Я думаю, что пробовал почти все комбинации, по крайней мере, мне так казалось... ;-))

Как разрешить это логическое свойство? Что нужно изменить?


person Kawu    schedule 15.09.2011    source источник


Ответы (1)


Вы не должны указывать имя метода, а только имя свойства. Вам нужно опустить префикс is (а также get и set) при указании свойств компонента.

<h:selectBooleanCheckbox value="#{node.toC}" />

EL просто автоматически использует правильный геттер/сеттер для свойства (обратите внимание, что это действительно означает, что физическое присутствие переменной экземпляра не обязательно). Исключение, которое вы получили,

Причина: javax.el.PropertyNotFoundException: /main.xhtml @541,64 value=#{node.isToC}: класс «ChapterTreeNode» не имеет свойства «isToC».

в основном означает, что нет такого метода, как isIsToc() или getIsToc() (и это правильно).

Ваша вторая проблема заключается в том, что вы использовали Boolean вместо boolean. Тогда вы действительно должны вызывать метод getToC() или getIsToC() вместо isToC(). В последнем случае вы можете просто продолжать использовать #{node.isToC}.

Смотрите также:

person BalusC    schedule 15.09.2011
comment
Хм, это не так просто, как кажется. Я хочу вызвать мое логическое значение isToC в классе, но имя геттера также должно быть isToC(). В JSF XHTML это будет #{file.toC}. Теперь это вызывает еще одно исключение: The class 'de.poyry.pqgenerator.pqtree.ChapterTreeNode' does not have a readable property 'toC'. Я думаю, мне нужно отказаться от именования моих логических значений так же, как полей? - person Kawu; 16.09.2011
comment
Извините, я проглядел, что вы использовали Boolean вместо boolean. Вы должны заменить его на boolean или переименовать геттер на getToC(). - person BalusC; 16.09.2011
comment
Странная штука! Хм. Таким образом, логическое значение просто рассматривается как не логическое... Я решил переименовать геттер в getIdToc, чтобы я мог использовать #{file.isToC} из JSF и сохранить isToC в качестве имени поля. - person Kawu; 16.09.2011
comment
EL не занимается автобоксом, нет. Boolean это Object. - person BalusC; 16.09.2011