Spring Boot项目PutMapping接口返回成功但数据无变化问题排查
问题根因及修复方案
1. 核心问题:实体修改未持久化到数据库
Service层修改Booking实体属性后,没有调用JPA Repository的save方法同步改动到数据库,修改仅作用于内存中的临时实体对象,不会自动落库。
修复代码:
public void updateBooking(Long bookingId, Integer tickets) { // 校验预约id是否存在 Booking booking = bookingRepository.findById(bookingId).orElseThrow(() -> new IllegalStateException( "预约id " + bookingId + " 不存在")); if (tickets != null && !Objects.equals(booking.getTickets(), tickets)) { booking.setTickets(tickets); // 原代码setAmount为无效赋值,若金额需按新票数重新计算,替换为对应计算逻辑即可,例如 booking.setAmount(tickets * 单张票价) // booking.setAmount(booking.getAmount()); // 新增save调用持久化修改 bookingRepository.save(booking); } else { throw new IllegalStateException("更新失败"); } }
2. 补充排查点
- 若Service类或
updateBooking方法添加了@Transactional注解,事务提交时会自动将托管态实体的改动刷入数据库,无需手动调用save,可先检查是否正确配置了事务注解。 - 确认Postman传参格式:
tickets是@RequestParam参数,需放在URL查询参数中传递,示例请求路径为PUT /你的接口路径/{bookingId}?tickets=新票数,如果将参数放在请求体中传递,后端会收到null,直接进入else分支抛出异常。 - 原Controller层返回值为
void,调用成功时不会返回任何响应,可根据业务需要添加响应体返回更新后的预约信息,方便调试确认修改结果。
内容的提问来源于stack exchange,提问作者Malik Safwan
相关产品推荐
相关产品推荐

