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 -
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
相似问题