在部署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
课程中。这是怎么造成的,我该如何解决?是否有任何注释我需要额外添加?
答案 0 :(得分:8)
让我们以一般格式重新描述异常,以便更好地理解原因:
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
,则表示该组件被解释为“纯文本”。否则你会看到例如org.primefaces.component.commandbutton.CommandButton
的特定情况下的<p:commandButton>
。