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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:06:07