【问题标题】:jsf giving method not found Exception though it is there, javax.el.MethodNotFoundExceptionjsf给出方法未找到异常,尽管它在那里,javax.el.MethodNotFoundException
【发布时间】:2015-05-14 05:37:03
【问题描述】:

我在尝试使用支持 bean 显示 h:dataTable 时遇到以下异常

javax.faces.el.MethodNotFoundException: javax.el.MethodNotFoundException: /table.xhtml @29,36 action="#{user.editEmployee}": Method not found: com.jason.jsf.User@1df228e.editEmployee()
javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:98)
javax.faces.component.UICommand.broadcast(UICommand.java:311)
javax.faces.component.UIData.broadcast(UIData.java:912)
javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:781)
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1246)
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:77)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:308)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

由于我是 jsf 的新手并且正在学习,所以在使用这些文件执行以下代码时,请帮忙解释一下

Employee.java

 package com.jason.jsf;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean(name = "employee", eager = true)
@SessionScoped
public class Employee {

    private String Id, name;
    private boolean canEdit;

    public Employee() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Employee(String id, String name) {
        super();
        Id = id;
        this.name = name;
    }

    public String getId() {
        return Id;
    }

    public void setId(String id) {
        Id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isCanEdit() {
        return canEdit;
    }

    public void setCanEdit(boolean canEdit) {
        this.canEdit = canEdit;
    }

}

这是我的 User.java

    package com.jason.jsf;

import java.util.ArrayList;
import java.util.Arrays;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean(name = "user", eager = true)
@SessionScoped
public class User {

    private static final long serialVersionUID = 1L;

    private String name;
    private String id;

    private static final ArrayList<Employee> employees = new ArrayList<Employee>(
            Arrays.asList(new Employee("John", "Marketing"), new Employee(
                    "Robert", "Marketing"), new Employee("Mark", "Sales"),
                    new Employee("Chris", "Marketing"), new Employee("Peter",
                            "Customer Care")));




    public ArrayList<Employee> getEmployees() {
        return employees;
    }

     public String addEmployee() {
     Employee employee = new Employee(name, id);
     employees.add(employee);
     return null;
     }

     public String deleteEmployee(Employee employee) {
     employees.remove(employee);
     return null;
     }

      public String editEmployee(Employee employee){
          employee.setCanEdit(true);
          return null;
       }

       public String saveEmployees(){
          //set "canEdit" of all employees to false 
          for (Employee employee : employees){
             employee.setCanEdit(false);
          }     
          return null;
       }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the id
     */
    public String getId() {
        return id;
    }

    /**
     * @param id
     *            the id to set
     */
    public void setId(String id) {
        this.id = id;
    }

}

这是我的 table.xhtml

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <title>JSF tutorial</title>
    <h:outputStylesheet library="css" name="style.css" />
</h:head>
<h:body>
    <h:form>
        <h:dataTable value="#{user.employees}" var="emp"
            styleClass="employeeTable" headerClass="employeeTableHeader"
            rowClasses="employeeTableOddRow,employeeTableEvenRow">
            <h:column>
                <f:facet name="header">Name</f:facet>
                <h:inputText value="#{emp.name}" size="10" rendered="#{emp.canEdit}" />
                <h:outputText value="#{emp.name}" rendered="#{not emp.canEdit}" />
            </h:column>
            <h:column>
                <f:facet name="header">ID</f:facet>
                <h:inputText value="#{emp.id}" size="20" rendered="#{emp.canEdit}" />
                <h:outputText value="#{emp.id}" rendered="#{not emp.canEdit}" />
            </h:column>
            <h:column>
                <f:facet name="header">Edit</f:facet>
                <h:commandButton value="Edit" action="#{user.editEmployee}"
                    rendered="#{not emp.canEdit}">
                </h:commandButton>
            </h:column>
        </h:dataTable>
        <br />
        <h:commandButton value="Save Employees" action="#{user.saveEmployees}" />

    </h:form>
</h:body>
</html>

我提到了不同的类似问题,但没有得到适合我的问题的答案。请帮我解决一下

提前致谢。

【问题讨论】:

  • 你的 JSF 版本是多少?
  • @kocko JSF 2.0 mojarra 2.0.3 Tomcat 7
  • eager = true 不适用于会话范围的 JSF 托管 bean。它完全没有任何作用,就好像它不存在一样——在这种情况下完全没有必要。

标签: jsf jsf-2 el


【解决方案1】:

据我所知,editEmployee(Employee employee) 方法有一个 Employee 类型的参数,但是您没有为该参数传递值,这就是它尝试调用具有相同名称的方法的原因,但是没有参数。

由于没有这样的,它会抛出一个MethodNotFoundException

由于您使用的是 JSF 2.0+,您可以像这样传递参数:

<h:commandButton value="Edit" action="#{user.editEmployee(emp)}"
                 rendered="#{not emp.canEdit}">
</h:commandButton>

【讨论】:

  • 我可以通过其他方式传递参数而不是在操作本身中传递参数吗?
  • 嗯...您可以使用actionListener 代替操作。见this thread
【解决方案2】:

数不胜数,我遇到过 MethodNotFoundException,很明显,该方法在 bean 上是公开可用的。如果我临时为 action 或 actionListener 指定不同的现有方法,JSF 将找到那个不同的方法。

干净的构建和部署是不够的; 我必须彻底重命名并移动“缺失”方法,然后清理构建,然后找到“缺失”(但现在重命名)方法。一旦它工作,我将重命名的方法改回原来的“缺失”名称,然后清理构建,然后之前的“缺失”方法不再缺失。

我很想知道是什么导致了 Eclipse Kepler 4.3.0 出现这个烦人的问题。

【讨论】:

  • 对我来说也一样,花了一个小时寻找一个不存在的错误。但在我的情况下,关闭并打开 Eclipse (Mars) 解决了这个问题。
  • 您说“不存在的错误”。当 IDE 决定它无法解析任何已声明的导入时,我有时会处理 Java 类,然后在整个活动编辑窗口中粘贴红色 X 图标。但是,我的 Ant 构建脚本仍然会清理和重建项目,并且它在服务器上运行良好。我通过菜单 Project::Clean::Clean All Projects 删除了所有红色 X 错误图标。很烦人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 2013-07-29
  • 2021-01-06
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
相关资源
最近更新 更多