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

Spring Boot修改密码API异常:返回200但数据库未更新

密码修改接口问题分析与修复

核心问题点

你的代码存在几个关键错误,导致密码未更新:

  • 密码验证逻辑错误:将布尔值与字符串做equals比较,结果永远为false,更新分支从未执行
  • 密码加密校验缺失:直接用明文比对数据库中加密后的密码,验证逻辑完全无效
  • 冗余代码干扰:无意义的ModelMapper转换代码,且未正确处理findById返回的Optional对象
  • 语法错误导致逻辑分支异常:if-else结构语法错误,执行路径不符合预期
  • 新密码未加密存储:直接存入明文密码,既不安全也不符合加密存储规范

正确的密码修改逻辑

  1. 根据ID查询用户,若用户不存在则抛出异常或返回错误提示
  2. 校验旧密码:使用密码编码器比对用户输入的明文旧密码与数据库中存储的加密密码
  3. 校验新密码与确认密码是否一致
  4. 对新密码进行加密处理
  5. 更新用户密码并保存到数据库
  6. 返回更新后的用户信息或成功状态

修复后的代码

1. Service层修复(ChangePasswordServiceImpl)

@Slf4j
@Service
public class ChangePasswordServiceImpl implements ChangePasswordService {

    private final PasswordJpaRepository jpaRepository;
    private final PasswordEncoder passwordEncoder;

    // 构造注入所有依赖,移除无用的ModelMapper
    public ChangePasswordServiceImpl(PasswordJpaRepository jpaRepository, PasswordEncoder passwordEncoder) {
        this.jpaRepository = jpaRepository;
        this.passwordEncoder = passwordEncoder;
    }

    @Override
    @Transactional
    public Member changePassword(Long id, ChangePasswordDto password) {
        // 1. 查询用户,不存在则抛出异常
        Member member = jpaRepository.findById(id)
                .orElseThrow(() -> new IllegalArgumentException("用户不存在"));

        // 2. 校验旧密码是否正确
        if (!passwordEncoder.matches(password.getOldPassword(), member.getPassword())) {
            throw new IllegalArgumentException("旧密码错误");
        }

        // 3. 校验新密码与确认密码是否一致
        if (!password.getNewPassword().equals(password.getReNewPassword())) {
            throw new IllegalArgumentException("新密码与确认密码不一致");
        }

        // 4. 加密新密码并更新保存
        member.setPassword(passwordEncoder.encode(password.getNewPassword()));
        return jpaRepository.save(member);
    }
}

2. Controller层优化(可选)

统一返回响应体,便于处理错误场景:

@RestController
@RequestMapping(value = "password", produces = { MediaType.APPLICATION_JSON_VALUE })
public class ChangePasswordController {

    private final ChangePasswordService service;

    public ChangePasswordController(ChangePasswordService passwordService) {
        this.service = passwordService;
    }

    @PostMapping("/change-password/{id}")
    public ResponseEntity<?> changePassword(@Validated @RequestBody ChangePasswordDto password, 
                                            @PathVariable(name = "id") Long id){
        try {
            Member updatedMember = service.changePassword(id, password);
            return ResponseEntity.ok(updatedMember);
        } catch (IllegalArgumentException e) {
            return ResponseEntity.badRequest().body(e.getMessage());
        }
    }
}

内容的提问来源于stack exchange,提问作者Plus Ultra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:01:10