You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

更新用户信息时如何检查邮箱唯一性并排除当前用户

解决更新用户时误判自身邮箱重复的问题

这问题太常见了!你现在的逻辑是只要数据库里能找到对应邮箱的用户就直接抛异常,但没考虑到这个用户就是当前正在更新的用户自己对吧?

问题根源

现有代码里,当用户更新资料但没改邮箱时,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:35:40