jsf giving方法未发现异常(尽管存在),javax.el.MethodNotFoundException

jsf giving方法未发现异常(尽管存在),javax.el.MethodNotFoundException,jsf,jsf-2,el,Jsf,Jsf 2,El,当尝试使用支持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.MethodBin

当尝试使用支持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;
    }

}
package com.jason.jsf;
导入java.util.ArrayList;
导入java.util.array;
导入javax.faces.bean.ManagedBean;
导入javax.faces.bean.SessionScoped;
@ManagedBean(name=“user”,eager=true)
@会议范围
公共类用户{
私有静态最终长serialVersionUID=1L;
私有字符串名称;
私有字符串id;
私有静态最终ArrayList雇员=新ArrayList(
Arrays.asList(新员工(“约翰”,“营销”),新员工(
“罗伯特”,“营销”),新员工(“马克”,“销售”),
新员工(“克里斯”、“营销”)、新员工(“彼得”,
"顾客关怀";;
公共阵列列表getEmployees(){
返回员工;
}
公共字符串addEmployee(){
员工=新员工(姓名、id);
employees.add(employees);
返回null;
}
公共字符串deleteEmployee(员工){
雇员。移除(雇员);
返回null;
}
公共字符串editEmployee(雇员){
employee.setCanEdit(true);
返回null;
}
公共字符串saveEmployees(){
//将所有员工的“canEdit”设置为false
用于(员工:员工){
employee.setCanEdit(false);
}     
返回null;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
/**
*@返回id
*/
公共字符串getId(){
返回id;
}
/**
*@param-id
*要设置的id
*/
公共无效集合id(字符串id){
this.id=id;
}
}
这是我的桌子

    <?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教程
名称
身份证件
编辑

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


提前感谢。

据我所知,
editEmployee(Employee-Employee)
方法有一个类型为
Employee
的参数,但是您没有为这个参数传递值,这就是为什么它试图调用一个名称相同但没有参数的方法

由于不存在这样的异常,它会抛出一个
MethodNotFoundException

由于您使用的是JSF 2.0+,因此可以按如下方式传递参数:

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

据我所知,
editEmployee(Employee-Employee)
方法有一个类型为
Employee
的参数,但是您没有为这个参数传递值,这就是为什么它试图调用一个名称相同但没有参数的方法

由于不存在这样的异常,它会抛出一个
MethodNotFoundException

由于您使用的是JSF 2.0+,因此可以按如下方式传递参数:

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

次数太多了,我遇到了MethodNotFoundException,很明显,该方法在bean上是公开的。如果我临时为action或actionListener指定一个不同的现有方法,JSF将发现这个不同的方法

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


我当然想知道是什么导致Eclipse开普勒4.3.0出现这个恼人的问题。

次数太多了,我有MethodNotFoundException,很明显,这个方法在bean上是公开的。如果我临时为action或actionListener指定一个不同的现有方法,JSF将发现这个不同的方法

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


我当然想知道Eclipse Kepler 4.3.0出现这个恼人问题的原因。

您的JSF版本是什么?@kocko JSF 2.0 mojarra 2.0.3 Tomcat 7
eager=true
不适用于会话范围的JSF托管bean。它没有任何用途,就好像它不存在一样——在本例中完全没有必要。您的JSF版本是什么?@kocko JSF 2.0 mojarra 2.0.3 Tomcat 7
eager=true
不适用于会话范围的JSF托管bean。它完全没有作用,就好像它不存在一样——在这种情况下完全没有必要。我可以用另一种方式传递参数,而不是在动作本身中传递参数吗?嗯……您可以使用
actionListener
而不是action。查看另一个查询我是否可以通过其他方式传递参数,而不是在操作本身中传递参数?嗯……您可以使用
actionListener
而不是操作。我也一样,花了一个小时寻找一个不存在的错误。但在我的例子中,关闭和打开Eclipse(Mars)解决了这个问题,你说的是“不存在的错误”。我有时会在一个Java类上工作,当IDE决定它不能解析任何声明的导入,然后是Plaster