Spring PropertyNotFoundException:目标不可访问,';userObj';返回带有jsf按钮和请求范围的null
情况如下,我有一个页面要添加/更新用户 在prerender方法中,根据参数创建新对象或获取现有对象Spring PropertyNotFoundException:目标不可访问,';userObj';返回带有jsf按钮和请求范围的null,spring,jsf,jakarta-ee,jsf-2,Spring,Jsf,Jakarta Ee,Jsf 2,情况如下,我有一个页面要添加/更新用户 在prerender方法中,根据参数创建新对象或获取现有对象 @Component("user") @Scope("request") public class UserBean { private User userObj; private boolean editUser; public String addUser() throws Exception { if (editUser) {
@Component("user")
@Scope("request")
public class UserBean {
private User userObj;
private boolean editUser;
public String addUser() throws Exception {
if (editUser) {
userService.updateUser(userObj);
} else {
userService.addUser(userObj);
}
return "users?faces-redirect=true";
}
public void preRender(ComponentSystemEvent event) throws Exception {
System.out.println("############ PRERENDER #############");
if (editUser) {
userObj = userService.getUser(userID);
pageTitle = "Updating " + userObj.getName();
buttonTitle = "Save Changes";
} else {
userObj = new User();
pageTitle = "Adding new user";
buttonTitle = "Add User";
}
}
在jsf页面中,我将prerender称为:
<f:event id="event1" listener="#{user.preRender}" type="javax.faces.event.PreRenderComponentEvent" />
但当我按下add按钮时,如下所示:
<h:commandButton value="#{user.buttonTitle}" action="#{user.addUser}" style="width: 105px; "/>
我遇到上述异常,请告知。问题是您的
h:commandButton
正在向服务器创建一个新请求,这会导致UserBean
在作用域请求中创建自身的新实例
我可以想出几种解决办法
(一)
似乎您知道您的页面是否处于编辑模式。然后,当调用userObj
的getter时,您可以摆脱preRender方法,而是从数据库中获取userObj
。然后,如果页面是否处于编辑模式,则可以传递到添加方法。因此,您必须修改命令按钮
:(注意:您必须将该值更改为当前编辑模式)
这会让你对它的工作原理有一个基本的了解。诀窍是使用f:setPropertyActionListener
2) 您可以使用视图范围来解决该问题。问题是spring没有提供这种开箱即用的功能。好消息是您可以自己构建视图范围。看看这个。我猜您的commandButton
正在向服务器创建一个新请求,这会导致UserBean创建一个新实例。因此,<代码> USER Obj/<代码>是空的。@ Flash有什么解决方案吗?”米卡素热,您应该考虑将范围从请求更改为会话。这将是最简单的解决办法。这对您来说是不可行的,还有其他解决方案。session不是一个好的解决方案。是的。@Mika您应该将作用域临时设置为session,以确认这是问题。好的,第二个解决方案工作得很好,但我注意到终端上有以下警告:警告:将不可序列化的属性值设置到ViewMap中:(key:user,value class:com.myapp.beans.UserBean)
有什么想法吗?顺便问一下,您是否有类似于上面所述的使用JSF2和spring的好示例/资源3@Mika试着让UserBean实现可序列化的接口。但是我的UserBean自动连接其他Bean,如dao和服务(SingleTon),我也不想序列化,明白了吗?@Mika您不必太担心警告。有关详细说明,请参阅
<h:commandButton value="#{user.buttonTitle}" action="#{user.addUser}" style="width: 105px; ">
<f:setPropertyActionListener value="true" target="#{user.editUser}" />
</h:commandButton>
@Component("user")
@Scope("request")
public class UserBean {
private User userObj;
private boolean editUser;
public String addUser() throws Exception {
userObj = getUserObj();
if (editUser) {
userService.updateUser(userObj);
} else {
userService.addUser(userObj);
}
return "users?faces-redirect=true";
}
public void setEditUser(boolean editUser) {
this.editUser = editUser;
}
public User getUserObj() {
if (editUser) {
if(userObj == null) {
userObj = userService.getUser(userID);
}
return userObj;
}
else {
return userObj = new User();
}
}
public void setUserObj(User userObj) {
this.userObj = userObj;
}