SpringBoot RestController批量保存Approver时序列ID生成失败求助
问题分析与解决方案
问题定位
批量保存失败的根源有两个:
- 实体类注解语法错误:
Approver类的@Column注解存在引号未闭合、列名重复的问题,导致JPA映射异常; - 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
相关产品推荐
相关产品推荐

