Spring中@RequestBody接收JSON出现400错误的技术求助
咱们一步步拆解你遇到的几个核心问题:
1. 初始400错误的根本原因
你最开始遇到的400请求错误,主要来自两个关键问题:
- 字段泛型缺失:你的
carCoordinates字段定义是protected List carCoordinates;,没有指定泛型类型List<Double>。Jackson在反序列化JSON中的double数组时,无法确定列表的元素类型,直接触发类型不匹配异常,返回400错误。 - Setter方法参数类型不兼容:你的
setCarCoordinates方法参数是Coordinate类型,但JSON里传递的是纯double数组列表,两者完全不匹配,Jackson无法正确解析该字段,进一步加剧了400错误的触发。
2. 字段名修改后的数据为null/请求失效的原因
当你把字段名改成carcoordinates但保留getCarCoordinates getter时:
Jackson默认会通过getter/setter的命名推断字段映射关系(驼峰命名通常会被转为小写下划线格式,或直接匹配驼峰字段名),此时你的getter是getCarCoordinates,Jackson会认为对应的字段是carCoordinates,但你实际的字段是carcoordinates,两者不匹配,导致JSON的值无法绑定到字段上,最终数据为null。
而当你把getter改成getCarcoordinates匹配字段名时,请求再次失效:
此时JSON里的字段是carCoordinates(驼峰格式),但你的字段和getter都是carcoordinates(全小写),且没有@JsonProperty注解指定映射关系,Jackson无法将JSON中的carCoordinates与类内的carcoordinates关联;再加上之前未解决的泛型和setter问题,自然请求又失败了。
另外还有个容易忽略的低级错误:你的getter方法里写的是return CarCoordinates;,这里的CarCoordinates是大写开头,而你的字段是carCoordinates(小写c),这会导致getter返回一个未定义的变量,就算字段有值,getter也会返回null。
快速修复方案
给你整理好修改后的正确代码:
public class CarEvent { // 指定泛型为Double,保留@JsonProperty绑定JSON字段名 @JsonProperty("carCoordinates") protected List<Double> carCoordinates; // 修改setter参数类型为List<Double>,与字段类型匹配 public void setCarCoordinates(List<Double> carCoordinates) { this.carCoordinates = carCoordinates; } // 修正拼写错误,返回正确的字段,保持getter命名与@JsonProperty匹配 public List<Double> getCarCoordinates() { return carCoordinates; } // 其他字段和方法... }
这样修改后:
- 字段指定了
List<Double>泛型,Jackson能正确解析JSON中的double数组 - setter参数类型与字段一致,可正确接收值
- getter修正了拼写错误,且与
@JsonProperty指定的字段名匹配,JSON里的carCoordinates能正确绑定到类的字段上
内容的提问来源于stack exchange,提问作者bobier2

