REST服务器遇对象含非空列表返回400错误求助
解决REST POST请求返回400错误的问题
看起来你踩了一个很常见的命名规范与字段类型不匹配的坑!让我帮你拆解问题并给出修复方案:
核心问题:字段与Setter方法不匹配
你的MainObject类里定义的是列表类型的字段:
List<SubObject> mySubObjects; // 复数形式,对应集合类型
但在循环里调用的Setter方法却是单数形式:
mainObject.setMySubObject(getSubObject()); // 这里是setMySubObject,单数命名
这会引发两个关键问题:
- 如果你手动写错了Setter方法名(正确应该是
setMySubObjects),那么实际上并没有给mySubObjects字段赋值,或者错误地把单个SubObject实例塞给了列表字段——这会导致序列化框架生成的JSON结构完全不符合服务器预期。 - 服务器期望
mySubObjects是一个数组格式,但实际收到的可能是单个对象、缺失字段,甚至是语法错误的JSON,自然会返回400 Bad Request。
修复步骤
1. 修正Setter方法调用
根据getSubObject()的返回值类型,分两种情况处理:
- 如果
getSubObject()返回单个SubObject实例:需要把它包装成列表后再赋值for (MainObject mainObject : mainList) { List<SubObject> subList = new ArrayList<>(); subList.add(getSubObject()); // 将单个对象加入列表 mainObject.setMySubObjects(subList); // 调用正确的复数Setter方法 } - 如果
getSubObject()本来就返回List<SubObject>:直接调用正确的Setter即可for (MainObject mainObject : mainList) { mainObject.setMySubObjects(getSubObject()); // 确保方法名是复数的setMySubObjects }
2. 验证JavaBean规范
确保MainObject的Setter/Getter严格符合JavaBean命名规则:
- 字段
mySubObjects对应的Setter应为public void setMySubObjects(List<SubObject> mySubObjects) - Getter应为
public List<SubObject> getMySubObjects()
序列化框架(比如Jackson)完全依赖这种规范来映射字段与JSON结构,命名错误会直接导致序列化失败。
3. 检查序列化后的JSON结构(可选)
可以在发送请求前打印序列化后的JSON,确认每个MainObject的mySubObjects是数组格式:
{ "mySubObjects": [ {"subField1": "value1", "subField2": "value2"} ] }
如果看到的是"mySubObject": {...}(单数字段名+单个对象),说明你的Setter/字段命名仍然存在问题。
额外提示
如果使用Spring Boot这类框架,建议用@JsonProperty注解明确指定JSON字段名,避免命名规范带来的隐式问题:
@JsonProperty("mySubObjects") List<SubObject> mySubObjects;
这样即使Setter/Getter命名有小偏差,也能强制映射到正确的JSON字段。
内容的提问来源于stack exchange,提问作者Olivier Alves
相关产品推荐
相关产品推荐

