客户端向Spring Controller传对象列表时遇400 Bad Request错误求助
解决Spring Controller接收Dojo Gridx数据时的400 Bad Request问题
看起来你遇到的核心问题是请求体格式不匹配,导致Spring无法正确解析JSON数据。我来帮你一步步排查和修复:
问题根源
你在Dojo的xhrPost里使用了content参数传递JSON字符串,但这个参数的作用是将数据编码为application/x-www-form-urlencoded的表单格式——哪怕你设置了Content-Type: application/json,Dojo依然会把content里的键值对转成表单格式发送。而你的Spring Controller用@RequestBody期望接收纯JSON数组,两者格式不匹配就抛出了400错误。
修复步骤
1. 修正Dojo的xhrPost请求
把content参数换成postData,直接传递JSON字符串作为原始请求体:
function goToReviewTargetsPage(){ var gridSelectedData = JSON.stringify( dijit.byId("geneGridNodeforSelectTargets").store.data); dojo.xhrPost({ url : contextPath + '/updateGeneData.htm', handleAs: 'json', headers: { 'Content-Type': 'application/json', }, applyAroundAdviceOnLoad : true, preventCache : true, postData: gridSelectedData, // 替换content为postData load : function(data) { /* do something */ }, error : function(error) { hideLoadingDialog(); } }); }
2. 确认Controller与POJO的匹配性
- 检查路径一致性:JS请求的是
/updateGeneData.htm,Controller映射的是/updateGeneData,要保证两者完全一致(要么都带.htm后缀,要么都去掉)。 - 验证
Disease类字段:JSON里的diseaseName需要对应Disease类中的private String diseaseName;属性,且要有对应的getter/setter方法。 - 调整集合类型(可选):Gene类的
diseases是Set<Disease>,Jackson默认可以解析JSON数组为Set,但如果出现解析问题,换成List<Disease>会更兼容JSON数组的习惯。
3. 验证请求负载
修复后,请求负载应该是你提供的纯JSON数组内容,而非带参数名的表单格式,这样Spring就能正确解析为Gene[]数组了。
额外注意事项
- 确保项目引入Jackson依赖:Spring Boot默认包含Jackson,传统Spring项目需要手动添加
jackson-databind依赖,否则Spring无法解析JSON请求体。 - 开启调试日志排查:如果问题仍存在,可以将Spring日志级别设为
DEBUG,关注org.springframework.web相关日志,能看到具体的解析错误细节(比如字段不匹配、类型转换失败等)。
内容的提问来源于stack exchange,提问作者SanTosh YaDav
相关产品推荐
相关产品推荐

