更新用户信息时如何检查邮箱唯一性并排除当前用户
解决更新用户时误判自身邮箱重复的问题
这问题太常见了!你现在的逻辑是只要数据库里能找到对应邮箱的用户就直接抛异常,但没考虑到这个用户就是当前正在更新的用户自己对吧?
问题根源
现有代码里,当用户更新资料但没改邮箱时,userRepository.findOneByEmail(updateUser.getEmail())查到的其实就是当前用户自己,这时候直接抛出“邮箱已被使用”就不合理了。我们需要加一层判断:只有当查到的邮箱属于其他用户时,才抛出异常。
修改后的代码
public User updateUser(UserDTO updateUser) throws IllegalArgumentException { System.out.print(updateUser.getId()); User user = this.userRepository.findOneById(updateUser.getId()); boolean isNewUser = (user == null); if (isNewUser) { user = new User(); } if (updateUser.getEmail() != null && !updateUser.getEmail().trim().isEmpty()) { User userCheck = this.userRepository.findOneByEmail(updateUser.getEmail()); if (userCheck == null) { user.setEmail(updateUser.getEmail()); } else { // 关键修改:判断查到的用户是否是当前用户自己 if (isNewUser || !userCheck.getId().equals(updateUser.getId())) { throw new IllegalArgumentException("Email already in use!"); } // 如果是当前用户自己,什么都不用做,保持原邮箱即可 } } return this.userRepository.save(user); }
关键逻辑说明
- 首先标记
isNewUser,区分是创建新用户还是更新现有用户:- 如果是新用户:只要邮箱已存在就直接抛异常(合理,新用户不能用别人的邮箱)
- 如果是更新现有用户:只有当查到的邮箱对应的用户ID和当前要更新的用户ID不一致时,才抛异常(说明这个邮箱被其他用户占用了)
- 另外把
!updateUser.getEmail().equals("")改成了!updateUser.getEmail().trim().isEmpty(),避免用户输入空格的无效情况,逻辑更严谨。
这样修改后,用户更新自己资料时即使保留原邮箱,也不会触发异常啦~
内容的提问来源于stack exchange,提问作者Georgi Michev
相关产品推荐
相关产品推荐

