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

Spring Boot REST API int数组请求体反序列化及参数绑定异常问题

Spring Boot答题接口反序列化报错排查与修复

核心报错说明

第一个错误日志中提到的[I是JVM对原生int数组类型的内部签名表示,不属于自定义类或第三方依赖类,两次报错本质都是JSON反序列化逻辑和请求结构不匹配导致的。

第一次报错(直接接收int[]参数时)触发原因

@RequestBody int[] answer的写法会告知Jackson反序列化组件:当前请求体的根JSON节点必须是数组格式(即[x,y,z]结构),但你实际传入的请求体是外层用{}包裹的JSON对象,Jackson解析到对象起始标记JsonToken.START_OBJECT时,发现目标类型是数组,类型无法匹配直接抛出反序列化异常。
另外你请求地址中多余的?id=1属于冗余参数,id已经通过路径占位符/{id}传递,重复传参不会直接触发本次报错,但属于不规范写法。

第二次报错(自定义包装类时字段为null)触发原因

你传入的JSON中答案对应的key是单数形式answer,但自定义AnswerArray类中定义的字段是复数形式answers,Jackson默认按字段名精确匹配做反序列化映射,字段名不匹配时不会自动注入值,因此拿到null触发@NotNull校验失败,哪怕你把字段类型换成int[]、Integer[],只要字段名和JSON key对不上,依然会拿到null。

修复方案

两种方案二选一即可:

  • 方案1(不使用包装类):保持控制器方法接收int[] answer的写法,修改请求体格式,去掉外层对象包裹,直接传数组:
    [2]
    
    同时删除请求URL后多余的?id=1参数,确认请求工具的raw格式选项选择JSON,保证Content-Type: application/json请求头正确。
  • 方案2(保留现有请求体结构):对齐Java字段和JSON key的映射关系,修改AnswerArray类,要么直接把字段名改为answer,要么通过@JsonProperty注解指定映射的JSON字段名,参考代码:
    import com.fasterxml.jackson.annotation.JsonProperty;
    import lombok.Data;
    import javax.validation.constraints.NotNull;
    import java.util.List;
    
    @Data
    public class AnswerArray {
      @NotNull
      // 映射JSON中key为answer的字段,如果直接把字段名定义为private List<Integer> answer; 可省略该注解
      @JsonProperty("answer")
      private List<Integer> answers;
    }
    
    控制器代码无需额外修改,同样注意去掉URL中冗余的query参数即可。

验证注意事项

  • 若直接接数组类型参数,请求体根节点必须以[开头,不能以{开头
  • 若接自定义对象参数,必须保证Java类字段名(或@JsonProperty指定的名称)和JSON中的key完全一致,大小写敏感
  • 发送请求时必须携带Content-Type: application/json请求头,否则Spring不会调用Jackson做JSON反序列化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:21:21