将客户端列表传递给Spring控制器

时间:2018-01-30 13:26:44

标签: javascript java json spring dojo

我在从客户端检索数据到控制器时遇到问题。

我收到 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},…]

2 个答案:

答案 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) {