无法通过EL-javax.EL.MethodNotFoundException将参数传递给方法
使用JSF2.0和EL,我试图在POJO上调用一个方法,POJO是viewscoped bean的一个属性。该代码实际上与的教程非常相似。当我调用一个不带参数的方法时,一切都很好。但是,当我尝试调用一个带有参数的方法时,会出现以下异常:无法通过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
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实现了可序列化{
/**/
私有静态最终长