无法通过EL传递参数到方法 – javax.el.MethodNotFoundException

使用JSF 2.0和EL,我试图在POJO上调用一个方法,POJO是一个viewscoped bean的属性。 代码实际上与@BalusC的教程非常相似。 当我调用一个不带参数的方法时,一切都很好。 但是当我尝试调用一个带参数的方法时,我得到以下exception:

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

     ...  

我有以下ViewScoped bean:

Users.java

 @ManagedBean(name = "users") @ViewScoped public class Users implements Serializable { private static final long serialVersionUID = 1L; private String id; private User user; @ManagedProperty("#{userService}") private UserService userService; // session scoped public void init() { user = userService.getCart(id); } public final String getId() { return id; } public final void setId(String id) { this.id= id; } public final User getUser() { return user; } public final void setUser(User user) { this.user= user; } public final void setUserService(UserService userService) { this.userService = userService; } } 

User类 – 一个POJO – 具有一个private List friends属性,带有getter和setter以及一个public方法User#removeFriend(Friend f) 。 它有另一种public方法; User#removeAllFriends()

页面呈现正常,但当我单击表中用户旁边的“删除”commandButton时,我得到了exception。

这有什么不对? 为什么我可以成功调用无参数方法但不能将参数传递给另一个?

编辑:应用程序部署在Tomcat 7.0上,如果有任何好处的话。

任何帮助赞赏。

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

这是Tomcat中的一个错误。 它直接在bean上调用方法时有效,但在嵌套属性上调用它时则无效。 我记得这个问题是我曾经报道过的问题50449 ,但是因为“对我有用 ”而被关闭了(也许他们没有对它进行非常正确的测试,我觉得再也不值得与Tomcat家伙争辩,我没有’与他们有很好的经历)。 无论如何,我已将其重新报告为问题52445 ,并且测试用例更加可靠 – 我希望如此。

同时,用Glassfish中的另一个替换EL实现应该可以解决。 但我可以告诉你,无论你想做什么都不是真正适当的方法。 您已在模型( User实体类)上声明了一个业务方法,而不是在控制器( Users托管bean类)上。 这个不对。 该模型应仅用于保存数据。 控制器应该用于保存业务操作。

我建议按如下方式重写您的案例:

              

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

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

UserService也是另一个@ManagedBean并不完全正确。 它应该是一个@Stateless EJB,但这是另一个故事。 Tomcat不支持EJB,而不用例如OpenEJB来丰富它。 没有EJB,它不一定需要是另一个托管bean。 您不希望直接将这些服务公开到视图中。

啊……解释它@ Tomcat ..你传递参数“#{users.user.removeFriend(friend)}”的方式是EL 2.2。 您可以通过以下步骤来解决这个问题: http : //www.mkyong.com/jsf2/how-to-pass-parameters-in-method-expression-jsf-2-0/或者通过使用描述的其他方式这里: http : //www.mkyong.com/jsf2/4-ways-to-pass-parameter-from-jsf-page-to-backing-bean/ 。 祝你好运!

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

xhtml文件中,你可以做这样的事情。

 #{ItemInformationController.setFindItem(525)} #{ItemInformationController.findItem}" var="AVar"> 

在您的控制器文件中,您可以执行以下操作:

 int itemId; public List getFindItem() { return getJpaController().findLevel3Item(levelId); } public void setFindItem(int 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 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 customerstList = new ArrayList(); Book book = new Book(); Set bookList = new HashSet(); 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(); }