我正在尝试将对象发布到使用Spring MVC实现的RESTful服务中,但是它不起作用。

在我的测试页中,我有:

var obj = { tobj: {id: 1, desc: 'yesh'}};
$.ajax({
    url : 'http://localhost:8180/CanvassService/canvass/test',
    type : 'POST',
    data : JSON.stringify(obj),
    contentType : 'application/json; charset=utf-8',
    dataType : 'json',
    async : false,
    success : function(msg) {
        alert(msg);
    }
});


我正在使用json2.js来对我的对象进行字符串化。

在我的控制器中,我有:

@RequestMapping(value="/canvass/test", method = RequestMethod.POST)
public void createTest(@RequestParam TestObj tobj)
        throws ServiceOperationException {
    // test method
    int i = 0;
    System.out.println(i);
}


我的实体类是:

public class TestObj {

    private int id;
    private String desc;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

}


当我将对象发布到控制器时,出现HTTP 400错误:


HTTP状态400-所需的TestObj参数'tobj'不存在


我做错了什么?似乎我发送的参数/对象的格式不正确,但是我不明白为什么...

最佳答案

您正在使用JSON数据进行POST,而在控制器中尝试将其解释为参数(即?tobj=someValue)。

尝试使用以下方法:

@RequestMapping(value="/canvass/test", method = RequestMethod.POST)
public void createTest(@RequestBody TestObj tobj)
        throws ServiceOperationException {
    // test method
    int i = 0;
    System.out.println(i);
}


此外,您不必嵌套JSON数据:

所以{id: 1, desc: 'yesh'}而不是{ tobj: {id: 1, desc: 'yesh'}}

在水下使用Jackons时,这应该起作用。

09-30 22:08