Spring Boot Patch更新接口返回404错误,JpaRepository.save异常排查
问题分析与解决
核心原因:请求路径与控制器映射不匹配
404错误意味着请求的路径未匹配到任何控制器方法,结合你的场景,可能的原因如下:
1. 控制器类基础路径重复定义
如果你的控制器类已添加@RequestMapping("/api")注解,那么方法上的@PatchMapping("/api/user")会让最终接口路径变为/api/api/user,而你实际请求的是/api/user,自然无法找到对应接口。
解决方法:
检查控制器类的注解,若已有@RequestMapping("/api"),则将方法上的映射改为@PatchMapping("/user"),确保最终路径为/api/user。
2. 请求路径末尾斜杠问题
虽然Spring Boot默认忽略路径末尾的斜杠,但部分配置或Postman的请求设置可能导致匹配失败。你返回的响应中path为/api/user/,而控制器映射的是/api/user,可以尝试去掉请求路径末尾的斜杠后重新测试。
3. 请求方法选择错误
确认Postman中选择的请求方法是PATCH,而非GET、POST等其他方法。若方法选错,也会出现路径匹配失败的404错误。
额外优化建议
AppUser实体类无需添加@Component注解,@Entity已足够让JPA管理该实体,多余的@Component可能导致不必要的实例创建。- 当前
save()方法逻辑存在隐患:直接传入AppUser对象调用save()时,若对象是游离态(非从数据库查询的实例),JPA可能执行插入而非更新操作。正确的更新逻辑应先通过ID查询数据库中的用户,再修改字段后保存:
AppUser existingUser = appUserRepository.findById(user.getId()) .orElseThrow(() -> new RuntimeException("User not found")); existingUser.setUsername(user.getUsername()); existingUser.setPassword(user.getPassword()); existingUser.setBalance(user.getBalance()); appUserRepository.save(existingUser);
内容的提问来源于stack exchange,提问作者Gabriel Chan
相关产品推荐
相关产品推荐

