请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

updateInformation中的bug

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    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());这段代码。

正在回答 回答被采纳积分+3

插入代码

5回答

Geely 2018-02-04 21:04:59

 你好,同学,首先赞一个这么精彩的问题和讨论,这个问题是这样,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 回复 有任何疑惑可以回复我~
提问者 qixin622 2018-02-01 11:11:22

https://img1.sycdn.imooc.com//szimg/5a7285f0000118ae08520563.jpg

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

这是controller代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@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代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 回复 有任何疑惑可以回复我~
星辰Iron 2018-02-01 00:27:56

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

https://img1.sycdn.imooc.com//szimg/5a71ee86000103ec08570967.jpg

0 回复 有任何疑惑可以回复我~
提问者 qixin622 2018-01-31 19:21:44

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 回复 有任何疑惑可以回复我~
星辰Iron 2018-01-30 23:48:40

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

0 回复 有任何疑惑可以回复我~
  • 提问者 qixin622 #1
    在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 19:20:36
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号