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的写法,修改请求体格式,去掉外层对象包裹,直接传数组:
同时删除请求URL后多余的[2]?id=1参数,确认请求工具的raw格式选项选择JSON,保证Content-Type: application/json请求头正确。 - 方案2(保留现有请求体结构):对齐Java字段和JSON key的映射关系,修改
AnswerArray类,要么直接把字段名改为answer,要么通过@JsonProperty注解指定映射的JSON字段名,参考代码:
控制器代码无需额外修改,同样注意去掉URL中冗余的query参数即可。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; }
验证注意事项
- 若直接接数组类型参数,请求体根节点必须以
[开头,不能以{开头 - 若接自定义对象参数,必须保证Java类字段名(或
@JsonProperty指定的名称)和JSON中的key完全一致,大小写敏感 - 发送请求时必须携带
Content-Type: application/json请求头,否则Spring不会调用Jackson做JSON反序列化
内容的提问来源于stack exchange,提问作者bmargoat
相关产品推荐
相关产品推荐

