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的。 10
- 
				  qixin622 提问者 2018-02-01  我截图后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信息。 00
- 
				  星辰Iron 2018-02-01 你好同学,我在DEBUG模式里面查看了一下你说session里面的属性信息,里面用户的username信息也是有的(如下图),你能说说你具体是怎么修改用户信息的吗?我这边操作是没看出来有什么问题的  00 00
- 
				  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()); } 00
- 
				  星辰Iron 2018-01-30 你好同学,老师的这种用户信息更新方式并不会导致用户名为NULL,userMapper.xml里面的updateByPrimaryKeySelective方法只会更新你POST请求里面指定的字段信息,其他的字段内容会保持原样,你可以尝试一下。 012018-01-31
相似问题
 
						
 
						