尝试解析EL中的布尔属性时出现javax.el.PropertyNotFoundException

Kaw*_*awu 13 jsf boolean el naming-conventions propertynotfoundexception

我有以下树节点类:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

这是一个简单的复选框,指示文档是否包含在任何内容中.但是,当试图从JSF 2 EL中引用它时

...
<h:selectBooleanCheckbox value="#{node.isToC}" />
...
Run Code Online (Sandbox Code Playgroud)

我得到一个例外:

引起:javax.el.PropertyNotFoundException:/main.xhtml @ 541,64 value ="#{node.isToC}":类'ChapterTreeNode'没有属性'isToC'.

(我想我几乎尝试了所有组合,至少我觉得这样...... ;-))

如何解决该布尔属性?需要改变什么?

Bal*_*usC 22

您不应指定方法名称,只能指定属性名称.您需要忽略is(与getset指定bean属性时)前缀.

<h:selectBooleanCheckbox value="#{node.toC}" />
Run Code Online (Sandbox Code Playgroud)

EL将自动为属性使用正确的getter/setter(请注意,这确实意味着实例变量的物理存在不是必需的).你得到的例外,

引起:javax.el.PropertyNotFoundException:/main.xhtml @ 541,64 value ="#{node.isToC}":类'ChapterTreeNode'没有属性'isToC'.

基本上意味着没有这样的方法isIsToc()getIsToc()(并且它没有权利).

你的第二个问题是你使用Boolean而不是boolean.然后你应该真的调用方法getToC()getIsToC()代替isToC().在后一种情况下,您可以继续使用#{node.isToC}.

也可以看看:

  • EL不做自动装箱,没有.`Boolean`是一个`Object`. (10认同)
  • 对不起,我忽略了你使用`Boolean`而不是`boolean`.你必须用`boolean`替换它或者将getter重命名为`getToC()`. (3认同)