Mur*_*zen 1 java jsf tomcat el primefaces
使用JSF 2.0和EL,我试图在POJO上调用一个方法,POJO是一个viewscoped bean的属性.该代码实际上是非常相似的@BalusC的教程在这里.当我调用一个不带参数的方法时,一切都很好.但是当我尝试调用一个带参数的方法时,我得到以下异常:
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()
Run Code Online (Sandbox Code Playgroud)
以下是一些更多细节:
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>
Run Code Online (Sandbox Code Playgroud)
我有以下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;
}
}
Run Code Online (Sandbox Code Playgroud)
的User
类-一个POJO -具有private List<Friend> friends
属性,具有吸气剂和setter和public
方法User#removeFriend(Friend f)
.它有另一种public
方法; User#removeAllFriends()
.
页面呈现正常,但是当我单击表中用户旁边的"删除"commandButton时,我得到了异常.
这有什么不对?为什么我可以成功调用无参数方法但不能将参数传递给另一个?
编辑:应用程序部署在Tomcat 7.0上,如果有任何好处的话.
任何帮助赞赏.
更新:正如BalusC和Neo所指出的,这是Tomcat 7.0的一个问题.我安装了WebLogic 12.1,一切正常.
这是Tomcat中的一个错误.它直接在bean上调用方法时有效,但在嵌套属性上调用它时则无效.我记得这个问题是我曾经报道的问题50449,但是因为"对我有用 "而被关闭了(也许他们没有对它进行非常正确的测试,我觉得再次与Tomcat的人争论是不值得的,我没有'与他们有很好的经历).无论如何,我已将其重新报告为问题52445,并且测试用例更加可靠 - 我希望如此.
同时,用Glassfish中的另一个替换EL实现应该可以解决.但我可以告诉你,无论你想做什么,都不是真正适当的方法.您已在模型(User
实体类)上声明了一个业务方法,而不是在控制器(Users
托管bean类)上.这个不对.该模型应仅用于保存数据.控制器应用于保存业务操作.
我建议按如下方式重写您的案例:
<h:form id="usersForm">
<p:outputPanel>
<p:dataTable id="userTable" value="#{users.user.friends}" var="friend">
<p:column>
<h:outputText value="#{friend.name}" />
</p:column>
<p:column>
<p:commandButton action="#{users.removeFriend(friend)}"
process="@this" update="userTable somethingElse" onerror="errorDialog.show();"
icon="ui-icon-delete" title="delete user" />
</p:column>
</p:dataTable>
</p:outputPanel>
<p:commandButton action="#{users.removeAllFriends}"
process="@this" update="userTable numUsers"
value="delete all friends?" />
</h:form>
Run Code Online (Sandbox Code Playgroud)
并将业务方法放在Users
托管bean中:
public void removeFriend(Friend friend) {
userService.removeFriend(user, friend);
// ...
}
public void removeAllFriends() {
userService.removeAllFriends(user);
// ...
}
Run Code Online (Sandbox Code Playgroud)
另外,UserService
作为另一种@ManagedBean
是不完全正确.它实际上应该是一个@Stateless
EJB,但这是另一个故事.Tomcat不支持EJB,而不用例如OpenEJB来丰富它.没有EJB,它不一定需要是另一个托管bean.您不希望直接将这些服务公开到视图中.
归档时间: |
|
查看次数: |
13444 次 |
最近记录: |