【问题标题】:javax.el.ELException: Could not find property actionMethod in class com.example.Beanjavax.el.E​​LException:在 com.example.Bean 类中找不到属性 actionMethod
【发布时间】:2011-10-31 06:39:50
【问题描述】:

在部署 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 类中。这是如何引起的,我该如何解决?有没有我必须额外添加的注释?

【问题讨论】:

    标签: jsf primefaces el


    【解决方案1】:

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

    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. 组件库根本没有安装。换句话说,包含组件库标签定义的 JAR 在 webapp 的 /WEB-INF/lib 文件夹中丢失。

    无论哪种方式,所有&lt;p:xxx&gt; 标签都不会被解析并被视为模板文本。但是,仍然会评估所有 EL 表达式(就像您使用 &lt;p&gt;#{bean.text}&lt;/p&gt; 一样),并且它们都将表现为 ValueExpressions 而不是 MethodExpressions。

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

    【讨论】:

    • :正如你提到的,我使用了相同的方法,例如 错误就像,未捕获的异常来自servlet javax.el.E​​LException: /CreateEmployee.xhtml: 无法在 com.fetchinglife.domain.dat 类中找到属性 saveEmployee ....
    • 您在视图中的其他位置没有另一个#{employeeRepositoryImpl.saveEmployee}
    • 正如 BalusC 所说,这几乎是唯一的解释。在页面的某个地方,您必须尝试将 #{employeeRepositoryImpl.saveEmployee} 绑定为值而不是方法。
    • 在我的例子中,getter 是私有的而不是公共的。如果您认为一切正确,请检查两次。
    猜你喜欢
    • 2011-12-18
    • 2016-06-10
    • 2016-12-29
    • 2023-03-25
    • 2016-05-29
    • 2015-12-07
    • 2012-03-13
    • 2017-09-01
    相关资源
    最近更新 更多