Spring Boot @PostMapping接收Long数组/List<Long>反序列化失败求助
问题根源
你当前的错误是JSON结构和后端接收参数的结构不匹配导致的:
- 前端传入的是一个外层包裹了
ids字段的JSON对象,并非直接传递Long类型数组 - 你直接用
Long[]/List<Long>作为@RequestBody接收参数时,Jackson会尝试将外层的JSON对象直接反序列化为数组/列表,结构不匹配自然抛出反序列化错误,和Long类型的转换逻辑无关,所以加@JsonDeserialize注解不会生效
解决方案
下面提供3种可直接落地的方案,按需选择即可:
方案1:封装参数DTO(最推荐,规范易维护)
自定义一个参数接收类,结构和前端传的JSON对应:
// 自定义DTO public class IdsRequest { private List<Long> ids; // 补全getter、setter方法,或者用Lombok的@Data注解简化代码 public List<Long> getIds() { return ids; } public void setIds(List<Long> ids) { this.ids = ids; } }
修改接口的参数声明:
@PostMapping(value = "/export") public ResponseEntity<SomeDto> exportCsv(@RequestBody IdsRequest request) { List<Long> ids = request.getIds(); // 原有业务逻辑 return ResponseEntity.ok(someDto); }
方案2:用Map临时接收(适合不想额外创建DTO的场景)
不用新建类,直接用Map承接JSON对象后取值:
@PostMapping(value = "/export") public ResponseEntity<SomeDto> exportCsv(@RequestBody Map<String, List<Long>> params) { List<Long> ids = params.get("ids"); // 原有业务逻辑 return ResponseEntity.ok(someDto); }
方案3:调整前端传参结构
如果可以协调前端修改传参,让前端直接传递数组作为请求体,不需要外层的对象包裹:
[1,2,3]
此时你原有代码里的Long[] ids或List<Long> ids参数可以直接正常接收,不需要额外修改后端逻辑。
内容的提问来源于stack exchange,提问作者giklo
相关产品推荐
相关产品推荐

