javax.el.E​​LException:在类com.example.Bean中找不到属性actionMethod

时间:2011-10-31 06:39:50

标签: jsf primefaces el

在部署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课程中。这是怎么造成的,我该如何解决?是否有任何注释我需要额外添加?

1 个答案:

答案 0 :(得分:8)

让我们以一般格式重新描述异常,以便更好地理解原因:

  

javax.el.E​​LException:在com.example.Bean类中找不到属性doSomething

这个例外实际上是试图告诉你Bean类没有以下方法:

public SomeObject getDoSomething() {
    return someObject;
}

(其中SomeObjectdoSomething属性的类型)

这有几个原因。

操作方法表达式被错误地解释为属性值表达式

鉴于属性名称在您的情况下实际上是动词和名词的组合,一个合理的原因是您错误地将动作方法绑定到某个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输出中的整个组件未被解析(您可以看到通过右键单击,在浏览器中查看源

这可能有以下几个原因:

  1. 组件的XML命名空间错误或缺失。例如。在PrimeFaces的情况下,当你实际使用PrimeFaces 3 +时,你不小心使用了旧的PrimeFaces 2.x URI。

    <html ... xmlns:p="http://primefaces.prime.com.tr/ui">
    
  2. XML命名空间URI包含拼写错误。

    <html ... xmlns:p="http://primefaecs.org/ui">
    
  3. XML名称空间前缀不匹配。

    <html ... xmlns:pf="http://primefaces.org/ui">
    
  4. XML名称空间完全缺失。

    <html ...>
    
  5. 根本没有安装组件库。换句话说,webapp的/WEB-INF/lib文件夹中缺少包含组件库标记定义的JAR。

  6. 无论哪种方式,都不会解析所有<p:xxx>标记并将其视为模板文本。但是,仍然会评估所有EL表达式(就好像您使用的是<p>#{bean.text}</p>),它们都将表现为ValueExpression而不是MethodExpression

    识别根本原因的一种简单方法是查看堆栈跟踪。如果您在堆栈跟踪中看到com.sun.faces.facelets.compiler.AttributeInstruction,则表示该组件被解释为“纯文本”。否则你会看到例如org.primefaces.component.commandbutton.CommandButton的特定情况下的<p:commandButton>