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

客户端向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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:30:48