尝试解析 EL 中的布尔属性时出现 javax.el.PropertyNotFoundException
Posted
技术标签:
【中文标题】尝试解析 EL 中的布尔属性时出现 javax.el.PropertyNotFoundException【英文标题】:javax.el.PropertyNotFoundException when trying to resolve Boolean properties in EL 【发布时间】: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'。
(我想我几乎尝试了所有组合,至少我是这样感觉的...... ;-))
如何解析该布尔属性?需要改变什么?
【问题讨论】:
【参考方案1】:您不应指定方法名称,而应仅指定属性名称。在指定 bean 属性时,您需要省略 is
(以及 get
和 set
)前缀。
<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
。
另见:
How does Java expression language resolve boolean attributes? (in JSF 1.2) javax.el.PropertyNotFoundException: Property 'foo' not found on type com.example.Bean【讨论】:
嗯,这并不像看起来那么容易。我想要在课堂上调用我的布尔值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 不做自动装箱,不。 Boolean
是 Object
。以上是关于尝试解析 EL 中的布尔属性时出现 javax.el.PropertyNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章
扩展与复选框相关的 jsf 组件时出现“无法解析类型 javax.el.ValueExpression”错误
尝试更新firestore中的数组时出现“TypeError:无法读取未定义的属性'arrayUnion'”
尝试在 OS X El Capitan 上安装 PyCrypto 时出现致命错误