![](/img/trans.png)
[英]rowSelectListener=“#{bean.method}” throws javax.el.ELException: The class 'com.example.Bean' does not have the property 'method'
[英]javax.el.ELException: Could not find property actionMethod in class com.example.Bean
在部署 GAE + primefaces 应用程序时,出现以下错误:
com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException: Error Rendering View[/CreateEmployee.xhtml]
javax.el.ELException: /CreateEmployee.xhtml: Could not find property saveEmployee in class com.fetchinglife.domain.data.dao.EmployeeRepositoryImpl
at com.sun.faces.facelets.compiler.AttributeInstruction.write(AttributeInstruction.java:94)
at com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:82)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:302)
at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
甚至saveEmployee
已经在EmployeeRepositoryImpl
类中。 这是怎么引起的,我该如何解决? 是否有任何我必须额外添加的注释?
让我们以通用格式重新表述异常,以便更好地理解原因:
javax.el.ELException:在类 com.example.Bean 中找不到属性 doSomething
这个异常实际上是想告诉你Bean
类没有以下方法:
public SomeObject getDoSomething() {
return someObject;
}
(其中SomeObject
是doSomething
属性的类型)
这有几个原因。
鉴于属性名称在您的情况下实际上是动词和名词的组合,一个合理的原因是您错误地将操作方法绑定到某个实际上采用值表达式而不是方法表达式的 JSF 组件的属性。 例如,当你不小心做
<h:commandButton value="#{bean.doSomething}">Save</h:commandButton>
甚至
<h:button value="Save" outcome="#{bean.doSomething}" />
代替
<h:commandButton value="Save" action="#{bean.doSomething}" />
后者然后会期望以下方法,您可能实际上拥有:
public String doSomething() {
// ...
return "nextpage";
}
(顺便也可以声明为返回void
)
另一个可能的原因是该组件根本没有被解释为真正的组件,而是作为“纯文本”。 换句话说,当您删除action
属性然后尝试在浏览器中打开 JSF 页面时,它现在可以正常加载,但是您将在生成的 HTML 输出中看到未解析的整个组件(您可以通过右键单击查看浏览器中的源)。
这可能有多种原因:
组件的 XML 命名空间错误或缺失。 例如,在 PrimeFaces 的情况下,您在实际使用 PrimeFaces 3+ 时不小心使用了旧的 PrimeFaces 2.x URI。
<html ... xmlns:p="http://primefaces.prime.com.tr/ui">
XML 命名空间 URI 包含一个错字。
<html ... xmlns:p="http://primefaecs.org/ui">
XML 命名空间前缀不匹配。
<html ... xmlns:pf="http://primefaces.org/ui">
XML 命名空间完全缺失。
<html ...>
根本没有安装组件库。 换句话说,webapp 的/WEB-INF/lib
文件夹中缺少包含组件库标签定义的 JAR。
无论哪种方式,所有<p:xxx>
标签都不会被解析并被视为模板文本。 但是,仍然会评估所有 EL 表达式(就像您使用<p>#{bean.text}</p>
),并且它们都将表现为ValueExpression
而不是MethodExpression
。
识别根本原因的一种简单方法是查看堆栈跟踪。 如果您在堆栈跟踪中看到com.sun.faces.facelets.compiler.AttributeInstruction
,则表示该组件被解释为“纯文本”。 否则你会在<p:commandButton>
的特定情况下看到例如org.primefaces.component.commandbutton.CommandButton
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.