繁体   English   中英

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

[英]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.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。

无论哪种方式,所有<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM