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

Spring Boot关联客户与房间的数据库新增接口失效问题排查

问题排查与解决方案

核心问题1:请求参数接收方式不匹配

你的Controller使用@RequestParam接收参数,但发送的请求是JSON请求体,@RequestParam仅能从URL查询参数或表单数据中获取值,无法解析JSON请求体,导致参数接收失败,业务层拿不到正确的ID,自然无法创建RoomLogs记录。

核心问题2:参数名称大小写不匹配

请求体中的字段是RoomID(大写D),但Controller参数是RoomId(小写d),即使接收方式正确,也会出现参数映射失败的情况。

其他潜在问题

  1. RoomLogs缺少Getter/Setter方法:JPA实体类需要提供字段的getter和setter方法,否则Hibernate无法正确访问和持久化字段值。
  2. 事务未开启:业务层中同时修改了Room的状态并保存RoomLogs,若未开启事务,可能出现部分操作生效、部分失败的情况,甚至导致RoomLogs无法入库。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:52:31