Spring Boot关联客户与房间的数据库新增接口失效问题排查
问题排查与解决方案
核心问题1:请求参数接收方式不匹配
你的Controller使用@RequestParam接收参数,但发送的请求是JSON请求体,@RequestParam仅能从URL查询参数或表单数据中获取值,无法解析JSON请求体,导致参数接收失败,业务层拿不到正确的ID,自然无法创建RoomLogs记录。
核心问题2:参数名称大小写不匹配
请求体中的字段是RoomID(大写D),但Controller参数是RoomId(小写d),即使接收方式正确,也会出现参数映射失败的情况。
其他潜在问题
- RoomLogs缺少Getter/Setter方法:JPA实体类需要提供字段的getter和setter方法,否则Hibernate无法正确访问和持久化字段值。
- 事务未开启:业务层中同时修改了Room的状态并保存RoomLogs,若未开启事务,可能出现部分操作生效、部分失败的情况,甚至导致RoomLogs无法入库。
- Room状态逻辑错误:关联房间给客户后,
room.setFree(true)不符合业务逻辑,应该设置为false(房间已被占用),虽然这不影响入库,但会导致数据逻辑错误。
具体修复步骤
1. 修改Controller参数接收方式
改用@RequestBody接收JSON请求体,同时创建一个DTO类封装请求参数:
// 请求参数DTO public class RoomLogRequest { private int KundenID; private int RoomID; // Getter和Setter public int getKundenID() { return KundenID; } public void setKundenID(int kundenID) { KundenID = kundenID; } public int getRoomID() { return RoomID; } public void setRoomID(int roomID) { RoomID = roomID; } } // 修改后的Controller @PostMapping("/add") public ResponseEntity<String> addLogs(@RequestBody RoomLogRequest request) { this.roomLogsService.addLogs(request.getKundenID(), request.getRoomID()); return ResponseEntity.ok("Added"); }
2. 给RoomLogs实体添加Getter/Setter方法
@Entity @Table public class RoomLogs { @Id @SequenceGenerator( name = "RoomLogs", sequenceName = "RoomLogs", allocationSize = 1 ) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "RoomLogs") private int id; @ManyToOne(cascade = CascadeType.PERSIST) private Kunde kunde; @ManyToOne(cascade = CascadeType.PERSIST) private Room room; // 构造方法 public RoomLogs(Kunde kunde, Room room) { this.kunde = kunde; this.room = room; } public RoomLogs() {} // Getter和Setter public int getId() { return id; } public void setId(int id) { this.id = id; } public Kunde getKunde() { return kunde; } public void setKunde(Kunde kunde) { this.kunde = kunde; } public Room getRoom() { return room; } public void setRoom(Room room) { this.room = room; } }
3. 给业务层方法添加事务注解
在addLogs方法上添加@Transactional,保证操作的原子性:
import org.springframework.transaction.annotation.Transactional; @Transactional public void addLogs(int kundenId, int roomId) { Optional<Kunde> k = this.kundeRespo.findById(kundenId); Optional<Room> r = this.roomRespo.findById(roomId); if (k.isPresent() && r.isPresent()) { Kunde kunde = k.get(); Room room = r.get(); RoomLogs roomL = new RoomLogs(kunde, room); room.setFree(false); // 修正状态逻辑:房间已被占用 this.roomLogsRespo.save(roomL); this.roomRespo.save(room); // 显式保存Room的状态修改 } }
4. 修正请求体格式
确保发送的请求体无多余转义符:
{ "KundenID": 20, "RoomID": 1 }
内容的提问来源于stack exchange,提问作者Shameer Riaz
相关产品推荐
相关产品推荐

