Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring PropertyNotFoundException:目标不可访问,';userObj';返回带有jsf按钮和请求范围的null_Spring_Jsf_Jakarta Ee_Jsf 2 - Fatal编程技术网

Spring PropertyNotFoundException:目标不可访问,';userObj';返回带有jsf按钮和请求范围的null

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) {

情况如下,我有一个页面要添加/更新用户 在prerender方法中,根据参数创建新对象或获取现有对象

@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;
}