我在从客户端检索数据到控制器时遇到问题。
我收到 400 Bad Request 错误,我找不到原因。
我在这里使用dojo gridx,这是js文件
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,
content :
{
"selectedTargetsData" : gridSelectedData
},
load : function(data)
{
\\do something
},
error : function(error)
{
hideLoadingDialog();
}
});
}
上面js中提到的gridSelectedData中的json数据是:
[{"id":1,"name":"ABL1","diseases":[{"id":1,"diseaseName":"CANCER"}],"SV":true,"CNV":true,"SNP":true},{"id":2,"name":"ALK","diseases":[{"id":1,"diseaseName":"CANCER"}],"SV":false,"CNV":true,"SNP":true},{"id":3,"name":"BLA","diseases":[{"id":1,"diseaseName":"CANCER"}],"SV":false,"CNV":false,"SNP":true},{"id":4,"name":"ALS","diseases":[{"id":2,"diseaseName":"LUNGS"}],"SV":false,"CNV":true,"SNP":true}]
这是来自控制器的代码
@RequestMapping(value = "/updateGeneData", produces = MediaType.APPLICATION_JSON_VALUE,
consumes = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.POST)
@ResponseBody
public List<Gene> getSelectedGenes(@RequestBody Gene[] genes,
HttpServletResponse response, HttpServletRequest request)
{
List<Gene> geneList = new ArrayList<>();
// do something
return geneList;
}
Gene.java(POJO)
public class Gene {
private Integer id;
private String name;
private boolean SNP = false;
private boolean SV = false;
private boolean CNV = false;
Set<Disease> diseases = new HashSet<Disease>();
//getters and setters
}
这是请求标题
Accept:*/*
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.9
ajaxRequest:true
Connection:keep-alive
Content-Encoding:UTF-8
Content-Length:795
Content-Type:application/json
X-Requested-With:XMLHttpRequest
有效负载为:
[{id: 1, name: "ABL1", diseases: [{id: 1, diseaseName: "CANCER"}], SV: true, CNV: true, SNP: true},…]
答案 0 :(得分:0)
从/ updateGeneData上的/updateGeneData.htm更改发布请求并删除属性produce = MediaType.APPLICATION_JSON_VALUE,consume = MediaType.APPLICATION_JSON_VALUE,
答案 1 :(得分:0)
你的控制器想要一个数组[]并且你传递一个列表。你的控制器应该是
@RequestMapping(value = "/updateGeneData",
produces MediaType.APPLICATION_JSON_VALUE,
consumes = MediaType.APPLICATION_JSON_VALUE,
method = RequestMethod.POST)
@ResponseBody
public List<Gene> getSelectedGenes(@RequestBody List<Gene> genes) {
List<Gene> geneList = new ArrayList<>();
// do something
return geneList;
}
我发现有时候我需要包装我的DTO才能让Jackson工作。这种方法过去对我有用。
class Genes extends ArrayList<Gene> { }
@ResponseBody
public List<Gene> getSelectedGenes(@RequestBody Genes genes) {