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

SpringBoot RestController批量保存Approver时序列ID生成失败求助

问题分析与解决方案

问题定位

批量保存失败的根源有两个:

  1. 实体类注解语法错误:Approver类的@Column注解存在引号未闭合、列名重复的问题,导致JPA映射异常;
  2. JSON反序列化类型丢失:Java泛型擦除导致Gson(当前使用的JSON解析器)无法将JSON数组正确反序列化为Approver对象列表,转而生成LinkedTreeMap集合,后续JPA操作时找不到实体类的id字段触发错误。

修复步骤

1. 修正实体类的注解错误

先修复Approver类里的语法与映射问题:

@Entity
@Getter
@Setter
@NoArgsConstructor
@Table(name = "Approver_DETAILS")
public class Approver implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
    @SequenceGenerator(name = "seq", sequenceName = "approver_seq", allocationSize = 1)
    @Column(name = "app_id") // 补全引号,设置唯一主键列名
    private int id;

    @Column(name = "sub_lob") // 补全引号,设置与主键不同的列名
    private String subLOB;
}
  • 原代码中id和subLOB共用app_pk列名会导致数据库字段冲突,必须改为不同列名;同时补全@Column注解缺失的闭合引号。

2. 解决JSON反序列化问题

方案一:手动指定泛型类型反序列化

修改Controller方法,手动将JSON字符串解析为List<Approver>:

@RestController
public class AppController {

    @Autowired
    private Repo repo;

    @PostMapping(value = "/upload")
    public ResponseEntity<String> upload(@RequestBody String requestBody) {
        Type type = new TypeToken<List<Approver>>() {}.getType();
        List<Approver> approvers = new Gson().fromJson(requestBody, type);
        
        repo.saveAll(approvers);
        return new ResponseEntity<>("success", HttpStatus.OK);
    }
}

方案二:切换回Jackson解析(推荐)

Spring Boot默认使用Jackson,它能自动处理泛型集合的反序列化。若之前手动配置了Gson,可移除相关依赖或配置,直接使用原Controller代码即可:

@RestController
public class AppController {

    @Autowired
    private Repo repo;

    @PostMapping(value = "/upload")
    public ResponseEntity<String> upload(@RequestBody List<Approver> approvers) {
        repo.saveAll(approvers);
        return new ResponseEntity<>("success", HttpStatus.OK);
    }
}

确保Lombok的@Getter/@Setter注解正常生效,Jackson就能正确完成反序列化。

3. 验证Repository接口

确认你的Repo接口继承了JPA的基础Repository:

public interface Repo extends JpaRepository<Approver, Integer> {
}

测试请求

使用原请求体重新测试:

[
    {
        "subLOB": "xxx"
    },
    {
        "subLOB": "yyy"
    }
]

此时批量保存可正常执行,不会再出现LinkedTreeMap相关错误。

内容的提问来源于stack exchange,提问作者Iswarya Elango

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:08:21