【问题标题】:javax.el.PropertyNotFoundException when trying to resolve Boolean properties in EL尝试解析 EL 中的布尔属性时出现 javax.el.PropertyNotFoundException
【发布时间】:2011-11-18 06:20:03
【问题描述】:

我有以下树节点类:

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'。

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

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

【问题讨论】:

    标签: jsf boolean naming-conventions el propertynotfoundexception


    【解决方案1】:

    您不应指定方法名称,而应仅指定属性名称。在指定 bean 属性时,您需要省略 is(以及 getset)前缀。

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

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

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

    基本上意味着没有isIsToc()getIsToc()这样的方法(它是正确的)。

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

    另见:

    【讨论】:

    • 嗯,这并不像看起来那么容易。我想要在课堂上调用我的布尔值isToC,但getter 的名字也应该是isToC()。在 JSF XHTML 中,这将是 #{file.toC}。这现在引发了另一个异常:The class 'de.poyry.pqgenerator.pqtree.ChapterTreeNode' does not have a readable property 'toC'. 我想我必须放弃将我的布尔值命名为与字段相同?
    • 抱歉,我忽略了您使用Boolean 而不是boolean。您必须将其替换为 boolean 或将 getter 重命名为 getToC()
    • 奇怪的东西!唔。所以布尔值只是被视为非布尔值......我决定将getter重命名为getIdToc,这样我就可以使用JSF中的#{file.isToC}并将isToC作为字段名。
    • EL 不做自动装箱,不。 BooleanObject
    猜你喜欢
    • 1970-01-01
    • 2020-04-05
    • 2011-02-16
    • 2022-01-20
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    相关资源
    最近更新 更多