在部署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)
Run Code Online (Sandbox Code Playgroud)
甚至saveEmployee已经EmployeeRepositoryImpl上课了.这是怎么造成的,我该如何解决?是否有任何注释我需要额外添加?
让我们以一般格式重新描述异常,以便更好地理解原因:
javax.el.ELException:在com.example.Bean类中找不到属性doSomething
这个例外实际上是试图告诉你Bean该类没有以下方法:
public SomeObject getDoSomething() {
return someObject;
}
Run Code Online (Sandbox Code Playgroud)
(物业SomeObject的类型在哪里doSomething)
造成这种情况的原因有很多.
鉴于属性名称在您的情况下实际上是动词和名词的组合,一个合理的原因是您错误地将动作方法绑定到某个JSF组件的属性,该属性实际上采用值表达式,而不是方法表达式.例如,当你不小心做的时候
<h:commandButton value="#{bean.doSomething}">Save</h:commandButton>
Run Code Online (Sandbox Code Playgroud)
甚至
<h:button value="Save" outcome="#{bean.doSomething}" />
Run Code Online (Sandbox Code Playgroud)
代替
<h:commandButton value="Save" action="#{bean.doSomething}" />
Run Code Online (Sandbox Code Playgroud)
后者会期望以下方法,您可能实际拥有:
public String doSomething() {
// ...
return "nextpage";
}
Run Code Online (Sandbox Code Playgroud)
(也可以声明返回void的方式)
另一个可能的原因是组件根本不被解释为真正的组件,而是"纯文本".换句话说,当您删除该action属性然后尝试在浏览器中打开JSF页面时,它现在可以正常加载,但您将在生成的HTML输出中看到整个组件未解析(您可以通过右键单击,查看源代码看到)在浏览器中).
这可能有几个原因:
组件的XML命名空间错误或缺失.例如,在PrimeFaces的情况下,当您实际使用PrimeFaces 3+时,您不小心使用了旧的PrimeFaces 2.x URI.
<html ... xmlns:p="http://primefaces.prime.com.tr/ui">
Run Code Online (Sandbox Code Playgroud)XML名称空间URI包含拼写错误.
<html ... xmlns:p="http://primefaecs.org/ui">
Run Code Online (Sandbox Code Playgroud)XML名称空间前缀不匹配.
<html ... xmlns:pf="http://primefaces.org/ui">
Run Code Online (Sandbox Code Playgroud)XML名称空间完全缺失.
<html ...>
Run Code Online (Sandbox Code Playgroud)根本没有安装组件库.换句话说,webapp /WEB-INF/lib文件夹中缺少包含组件库标记定义的JAR .
无论哪种方式,都<p:xxx>不会解析所有标记并将其视为模板文本.但是,所有EL表达式仍将被评估(就像你正在使用的那样<p>#{bean.text}</p>),并且它们都将表现为ValueExpressions而不是MethodExpressions.
识别根本原因的一种简单方法是查看堆栈跟踪.如果您com.sun.faces.facelets.compiler.AttributeInstruction在堆栈跟踪中看到,则表示该组件被解释为"纯文本".否则你会看到例如org.primefaces.component.commandbutton.CommandButton在特定情况下<p:commandButton>.
| 归档时间: |
|
| 查看次数: |
5188 次 |
| 最近记录: |