updateInformation中的bug

来源:6-9 用户模块所有功能自测试

qixin622

2018-01-30

    UserController.java
    @RequestMapping(value = "update_information.do",method = RequestMethod.POST)
    @ResponseBody
    public ServerResponse<User> update_information(HttpSession session,User user){
        User currentUser = (User)session.getAttribute(Const.CURRENT_USER);
        if(currentUser == null){
            return ServerResponse.createByErrorMessage("用户未登录");
        }
        user.setId(currentUser.getId());
        user.setUsername(currentUser.getUsername());
        ServerResponse<User> response = iUserService.updateInformation(user);
        if(response.isSuccess()){
            response.getData().setUsername(currentUser.getUsername());
            session.setAttribute(Const.CURRENT_USER,response.getData());
        }
        return response;
    }
UserServiceImpl.java
    public ServerResponse<User> updateInformation(User user){
        //username是不能被更新的
        //email也要进行一个校验,校验新的email是不是已经存在,并且存在的email如果相同的话,不能是我们当前的这个用户的.
        int resultCount = userMapper.checkEmailByUserId(user.getEmail(),user.getId());
        if(resultCount > 0){
            return ServerResponse.createByErrorMessage("email已存在,请更换email再尝试更新");
        }
        User updateUser = new User();
        updateUser.setId(user.getId());
        updateUser.setEmail(user.getEmail());
        updateUser.setPhone(user.getPhone());
        updateUser.setQuestion(user.getQuestion());
        updateUser.setAnswer(user.getAnswer());

        int updateCount = userMapper.updateByPrimaryKeySelective(updateUser);
        if(updateCount > 0){
            return ServerResponse.createBySuccess("更新个人信息成功",updateUser);
        }
        return ServerResponse.createByErrorMessage("更新个人信息失败");
    }

老师,您在视频中的UserController.java中指定了user.setUsername(currentUser.getUsername());

而在UserServiceImpl.java代码中的updateUser中并未指定username,这样在测试update_information.do功能时更新完用户信息后会出现session中用户名为null的现象。

我觉得应该加上updateUser.setUsername(user.getUsername());这段代码。

写回答

5回答

Geely

2018-02-04

 你好,同学,首先赞一个这么精彩的问题和讨论,这个问题是这样,updateuser在service里的确没有setusername,但是在存入session之前是有setusername的,代码就是你发的这里


if(response.isSuccess()){

            response.getData().setUsername(currentUser.getUsername());

            session.setAttribute(Const.CURRENT_USER,response.getData());

        }




从resposne里拿出getDate,然后直接调用的setusername方法,把session里之前的currentuser的name放进去。然后存入session。

所以这里存入的user是有username的。


1
0

qixin622

提问者

2018-02-01

//img.mukewang.com/szimg/5a7285f0000118ae08520563.jpg

我截图后username信息确实为空啊。

这是controller代码:

@RequestMapping(value = "update_information.do", method = RequestMethod.POST)
@ResponseBody
public ServerResponse<User> updateInformation(HttpSession session, User user){
   User currentUser = (User) session.getAttribute(Const.CURRENT_USER);
   if(currentUser == null){
       return ServerResponse.createByErrorMessage("用户未登录");
   }
   //防止横向越权,从session中获取用户id
   user.setId(currentUser.getId());
   //下面这行代码貌似没有用
   user.setUsername(currentUser.getUsername());
   ServerResponse<User> response = iUserService.updateInformation(user);
   if(response.isSuccess()){
       session.setAttribute(Const.CURRENT_USER,response.getData());
   }
   return response;
}

这是service代码:

public ServerResponse<User> updateInformation(User user){
       //username是不能被更新的
       //email也要进行一个校验,校验新的email是不是已经存在,并且存在的email如果相同的话,不能是我们当前的这个用户的
       int resultCount = userMapper.checkEmailByUserId(user.getEmail(),user.getId());
       if(resultCount > 0){
           return ServerResponse.createByErrorMessage("email已经存在,请更换email再尝试更新");
       }
       User updateUser = new User();
       updateUser.setId(user.getId());
       //自己加的代码,不加session中无username信息
//        updateUser.setUsername(user.getUsername());
       updateUser.setEmail(user.getEmail());
       updateUser.setPhone(user.getPhone());
       updateUser.setQuestion(user.getQuestion());
       updateUser.setAnswer(user.getAnswer());

       int updateCount = userMapper.updateByPrimaryKeySelective(updateUser);
       if(updateCount > 0){
           return ServerResponse.createBySuccess("更新个人信息成功",updateUser);
       }
       return ServerResponse.createByErrorMessage("更新个人信息失败");
   }

我看视频中源代码和下载的源代码中都没有// updateUser.setUsername(user.getUsername());这段代码,从代码结构原理分析来看,session调用session.setAttribute(Const.CURRENT_USER,response.getData());获得的updateUser信息里面肯定是没有username的。我不知道为什么你们的代码运行后有username信息。难道你们代码自己加过updateUser.setUsername(user.getUsername());这段代码吗?我自己加上后也正常能显示username信息。


0
0

星辰Iron

2018-02-01

你好同学,我在DEBUG模式里面查看了一下你说session里面的属性信息,里面用户的username信息也是有的(如下图),你能说说你具体是怎么修改用户信息的吗?我这边操作是没看出来有什么问题的

//img.mukewang.com/szimg/5a71ee86000103ec08570967.jpg

0
0

qixin622

提问者

2018-01-31

UserServiceImpl.java代码中执行正常我们返回了return ServerResponse.createBySuccess("更新个人信息成功",updateUser);

而在UserController.java中,我们通过response.getData();接收到了这个updateUser,而这个updateUser里面没有username信息,然后放到了session中,这时session的user数据就会没有username信息啊。

if(response.isSuccess()){

            response.getData().setUsername(currentUser.getUsername());

            session.setAttribute(Const.CURRENT_USER,response.getData());

        }


0
0

星辰Iron

2018-01-30

你好同学,老师的这种用户信息更新方式并不会导致用户名为NULL,userMapper.xml里面的updateByPrimaryKeySelective方法只会更新你POST请求里面指定的字段信息,其他的字段内容会保持原样,你可以尝试一下。

0
1
qixin622
在UserServiceImpl.java代码中执行正常我们返回了return ServerResponse.createBySuccess("更新个人信息成功",updateUser); 而在UserController.java中,我们通过response.getData();接收到了这个updateUser,而这个updateUser没有username的信息,然后放到了session中,这时session的user数据就会没有username信息啊。 if(response.isSuccess()){ response.getData().setUsername(currentUser.getUsername()); session.setAttribute(Const.CURRENT_USER,response.getData()); }
2018-01-31
共1条回复

从0开始 独立完成企业级Java电商网站服务端开发

前后端分离,数据库接口设计,架构设计,功能开发,上线运维

9476 学习 · 8804 问题

查看课程