无法通过EL-javax.EL.MethodNotFoundException将参数传递给方法

无法通过EL-javax.EL.MethodNotFoundException将参数传递给方法,java,jsf,tomcat,primefaces,el,Java,Jsf,Tomcat,Primefaces,El,使用JSF2.0和EL,我试图在POJO上调用一个方法,POJO是viewscoped bean的一个属性。该代码实际上与的教程非常相似。当我调用一个不带参数的方法时,一切都很好。但是,当我尝试调用一个带有参数的方法时,会出现以下异常: javax.faces.el.MethodNotFoundException: javax.el.MethodNotFoundException: /user.xhtml at line 42 and column 32 action="#{users.user

使用JSF2.0和EL,我试图在POJO上调用一个方法,POJO是viewscoped bean的一个属性。该代码实际上与的教程非常相似。当我调用一个不带参数的方法时,一切都很好。但是,当我尝试调用一个带有参数的方法时,会出现以下异常:

javax.faces.el.MethodNotFoundException: javax.el.MethodNotFoundException:
/user.xhtml at line 42 and column 32 action="#{users.user.removeFriend(friend)}":
Method not found: model.User@67f2b0dd.removeFriend()
以下是一些更详细的信息:

user.xhtml

<f:metadata>
    <f:viewParam name="id" value="#{users.id}" />
    <f:event type="preRenderView" listener="#{users.init}" />
</f:metadata>

...

<h:form id="usersForm">
    <p:outputPanel>    
        <p:dataTable id="userTable" value="#{users.user.friendList}" var="friend">
            <p:column>
                <h:outputText value="#{friend.name}" />
            </p:column>
            <p:column>
                <p:commandButton action="#{users.user.removeFriend(friend)}"
                    ajax="true"
                    update="userTable somethingElse" process="@this"
                    onerror="errorDialog.show();"
                    icon="ui-icon-delete"
                    title="delete user">
                </p:commandButton>
            </p:column>
        </p:dataTable>
    </p:outputPanel>

    <p:commandButton action="#{users.user.removeAllFriends()}" ajax="true"
                update="userTable somethingElse"
                process="@this"
                icon="ui-icon-close"
                value="delete all friends?">
    </p:commandButton>


</h:form>
User
class-a POJO-有一个
private List friends
属性,带有getter和setter以及一个
public
方法
User#removefriends(Friend f)
。它有另一个
公共
方法<代码>用户#删除所有好友()

页面呈现良好,但当我单击表中用户旁边的“删除”命令按钮时,会出现异常

这里怎么了?为什么我可以成功地调用一个无参数方法,但不能将参数传递给另一个方法

编辑:应用程序部署在Tomcat 7.0上,如果这样做有好处的话

谢谢你的帮助


更新:正如BalusC和Neo所指出的,这是Tomcat 7.0的一个问题。我安装了WebLogic 12.1,一切正常。

啊。。这就解释了@Tomcat。。传递参数“#{users.user.removeFriend(friend)}”的方式是EL 2.2。您可以通过以下步骤来克服这一问题:或者使用此处所述的其他方法:。祝你好运

啊。。这就解释了@Tomcat。。传递参数“#{users.user.removeFriend(friend)}”的方式是EL 2.2。您可以通过以下步骤来克服这一问题:或者使用此处所述的其他方法:。祝你好运

这是Tomcat中的一个bug。当您直接在bean上调用该方法时,它就工作了,但当您在嵌套属性上调用它时,它就不工作了。我记得我曾经报道过这个问题,但最后以“对我有用”而告终(也许他们没有很好地测试它,我觉得不值得再次与Tomcat的家伙争论,我与他们没有很好的经验)。无论如何,我已经用一个更可靠的测试用例重新报告了它——我希望如此

与此同时,用不同的EL实现(例如Glassfish)替换EL实现应该是可行的。但我可以告诉你,无论你想做什么都不是正确的方法。您已经在模型(
User
entity类)上声明了业务方法,而不是在控制器(
Users
managedbean类)上声明了业务方法。这是不对的。模型应仅用于保存数据。控制器应用于保存业务操作

我建议将您的案例改写如下:


并将业务方法放在
Users
托管bean中:

public void removeFriend(Friend friend) {
    userService.removeFriend(user, friend);
    // ...
}

public void removeAllFriends() {
    userService.removeAllFriends(user);
    // ...
}

另外,
UserService
作为另一个
@ManagedBean
并不完全正确。它实际上应该是一个无状态的EJB,但那是另一回事了。在Tomcat上无论如何都不支持EJB,除非使用例如。没有EJB,它不一定是另一个托管bean。您不想将这些服务直接公开到视图中。

这是Tomcat中的一个错误。当您直接在bean上调用该方法时,它就工作了,但当您在嵌套属性上调用它时,它就不工作了。我记得我曾经报道过这个问题,但最后以“对我有用”而告终(也许他们没有很好地测试它,我觉得不值得再次与Tomcat的家伙争论,我与他们没有很好的经验)。无论如何,我已经用一个更可靠的测试用例重新报告了它——我希望如此

与此同时,用不同的EL实现(例如Glassfish)替换EL实现应该是可行的。但我可以告诉你,无论你想做什么都不是正确的方法。您已经在模型(
User
entity类)上声明了业务方法,而不是在控制器(
Users
managedbean类)上声明了业务方法。这是不对的。模型应仅用于保存数据。控制器应用于保存业务操作

我建议将您的案例改写如下:


并将业务方法放在
Users
托管bean中:

public void removeFriend(Friend friend) {
    userService.removeFriend(user, friend);
    // ...
}

public void removeAllFriends() {
    userService.removeAllFriends(user);
    // ...
}

另外,
UserService
作为另一个
@ManagedBean
并不完全正确。它实际上应该是一个无状态的EJB,但那是另一回事了。在Tomcat上无论如何都不支持EJB,除非使用例如。没有EJB,它不一定是另一个托管bean。您不想将这些服务直接公开到视图中。

如果您使用的是Tomcat,您可以执行以下操作

xhtml文件中,您可以执行以下操作

#{ItemInformationController.setFindItem(525)}
#{ItemInformationController.findItem}" var="AVar">
控制器文件中可以执行以下操作:

int itemId;

public List<Item> getFindItem() {
    return getJpaController().findLevel3Item(levelId);
}

public void setFindItem(int id) {
    itemId= id;
}
int-itemId;
公共列表getFindItem(){
返回getJpaController().findLevel3Item(levelId);
}
公共无效setFindItem(内部id){
itemId=id;
}

这适用于Tomcat 6/7…

如果您使用的是Tomcat,则可以执行以下操作

enter code here


@ManagedBean(name = "customerBean")
    @SessionScoped
    public class CustomerBean implements Serializable {
        /**/
        private static final long serialVersionUID = 1L;
        CustomerManager customerManager = CustomerManager.getInstance();


        private Book book;
        private Long id;
        private String name, vorname, addresse, ort;

        Customer customer = new Customer();
        ArrayList<Customer> customerList;

        public void findCustomer(String name){
            CustomerManager.getInstance().findCustomerByName(name);
        System.out.println("Hello" + customer.getName());

        }

    getters and setters...




     public class CustomerManager {
            static EntityManagerFactory emf;
            static EntityManager em;
            static CustomerManager instance;
            EntityTransaction entityTransaction = null;

            public CustomerManager() {
                emf = Persistence.createEntityManagerFactory("customerRegistration");
                em = emf.createEntityManager();
            }

            List<Customer> customerstList = new ArrayList<Customer>();
            Book book = new Book();
            Set<Book> bookList = new HashSet<Book>();

            Customer customer = new Customer();
    public void findCustomerByName(String name) {   
            // Query for a single object.
            Query query = em.createQuery("Select c FROM Customer c WHERE c.name = :name");
            query.setParameter("name", name);
            System.out.println("Hello from Business");
            customer = (Customer)query.getSingleResult();


                  }



    <ui:define name="content">
            <h:body>

                <h:form id="main">
                    <p:panelGrid columns="2">
                        <p:outputLabel for="name" value="#{texts.name}" />
                        <p:inputText id="name" value="#{customerBean.customer.name}" />


                        <h:commandButton value="Search"
                            action="#{customerBean.findCustomer()}" />
                    </p:panelGrid>
                </h:form>

            </h:body>
        </ui:define> 
xhtml文件中,您可以执行以下操作

#{ItemInformationController.setFindItem(525)}
#{ItemInformationController.findItem}" var="AVar">
控制器文件中可以执行以下操作:

int itemId;

public List<Item> getFindItem() {
    return getJpaController().findLevel3Item(levelId);
}

public void setFindItem(int id) {
    itemId= id;
}
int-itemId;
公共列表getFindItem(){
返回getJpaController().findLevel3Item(levelId);
}
公共无效setFindItem(内部id){
itemId=id;
}
这适用于Tomcat 6/7…

在此处输入代码
enter code here


@ManagedBean(name = "customerBean")
    @SessionScoped
    public class CustomerBean implements Serializable {
        /**/
        private static final long serialVersionUID = 1L;
        CustomerManager customerManager = CustomerManager.getInstance();


        private Book book;
        private Long id;
        private String name, vorname, addresse, ort;

        Customer customer = new Customer();
        ArrayList<Customer> customerList;

        public void findCustomer(String name){
            CustomerManager.getInstance().findCustomerByName(name);
        System.out.println("Hello" + customer.getName());

        }

    getters and setters...




     public class CustomerManager {
            static EntityManagerFactory emf;
            static EntityManager em;
            static CustomerManager instance;
            EntityTransaction entityTransaction = null;

            public CustomerManager() {
                emf = Persistence.createEntityManagerFactory("customerRegistration");
                em = emf.createEntityManager();
            }

            List<Customer> customerstList = new ArrayList<Customer>();
            Book book = new Book();
            Set<Book> bookList = new HashSet<Book>();

            Customer customer = new Customer();
    public void findCustomerByName(String name) {   
            // Query for a single object.
            Query query = em.createQuery("Select c FROM Customer c WHERE c.name = :name");
            query.setParameter("name", name);
            System.out.println("Hello from Business");
            customer = (Customer)query.getSingleResult();


                  }



    <ui:define name="content">
            <h:body>

                <h:form id="main">
                    <p:panelGrid columns="2">
                        <p:outputLabel for="name" value="#{texts.name}" />
                        <p:inputText id="name" value="#{customerBean.customer.name}" />


                        <h:commandButton value="Search"
                            action="#{customerBean.findCustomer()}" />
                    </p:panelGrid>
                </h:form>

            </h:body>
        </ui:define> 
@ManagedBean(name=“customerBean”) @会议范围 公共类CustomerBean实现了可序列化{ /**/ 私有静态最终长