无法通过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(); }