JSON发布到Spring Controller

时间:2013-08-31 16:44:54

标签: java json spring spring-mvc

您好我在Spring中开始使用Web Services,因此我尝试在Spring + JSON + Hibernate中开发小型应用程序。我在HTTP-POST方面遇到了一些问题。我创建了一个方法:

@RequestMapping(value="/workers/addNewWorker", method = RequestMethod.POST, produces = "application/json", consumes = "application/json")
@ResponseBody
public String addNewWorker(@RequestBody Test test) throws Exception {
    String name = test.name;
    return name;
}

我的模特测试看起来像:

public class Test implements Serializable {

private static final long serialVersionUID = -1764970284520387975L;
public String name;

public Test() {
}
}

通过POSTMAN我只发送JSON {“name”:“testName”}并且我总是收到错误;

The server refused this request because the request entity is in a format not supported by the requested resource for the requested method.
我进口了杰克逊图书馆。我的GET方法运行正常。我不知道我做错了什么。我很感激任何建议。

5 个答案:

答案 0 :(得分:25)

使用

将JSON对象转换为JSON字符串

JSON.stringify({“name”:“testName”})

或手动。 @RequestBody期待json字符串而不是json对象。

注意:stringify函数与某些IE版本有问题,firefox会起作用

验证您的POST请求的ajax请求的语法。 ajax请求中需要 processData:false 属性

$.ajax({ 
    url:urlName,
    type:"POST", 
    contentType: "application/json; charset=utf-8",
    data: jsonString, //Stringified Json Object
    async: false,    //Cross-domain requests and dataType: "jsonp" requests do not support synchronous operation
    cache: false,    //This will force requested pages not to be cached by the browser  
     processData:false, //To avoid making query String instead of JSON
     success: function(resposeJsonObject){
        // Success Action
    }
});

<强>控制器

@RequestMapping(value = urlPattern , method = RequestMethod.POST)

public @ResponseBody Test addNewWorker(@RequestBody Test jsonString) {

    //do business logic
    return test;
}

@RequestBody -Covert Json对象到java

@ResponseBody - 将Java对象转换为json

答案 1 :(得分:1)

您需要为模型Test类中定义的所有字段都包括getter和setter-

public class Test implements Serializable {

    private static final long serialVersionUID = -1764970284520387975L;

    public String name;

    public Test() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

答案 2 :(得分:0)

尝试使用application / *代替。并使用JSON.maybeJson()来检查控制器中的数据结构。

答案 3 :(得分:0)

如果要将json用作http请求和响应,请执行以下操作。所以我们需要在[context] .xml

中进行更改
_titleAttributesChanged

MappingJackson2HttpMessageConverter到RequestMappingHandlerAdapter messageConverters,以便Jackson API启动并将JSON转换为Java Bean,反之亦然。通过这种配置,我们将在请求体中使用JSON,我们将在响应中接收JSON数据。

我还为控制器部分提供了小代码片段:

<!-- Configure to plugin JSON as request and response in method handler -->
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <beans:property name="messageConverters">
        <beans:list>
            <beans:ref bean="jsonMessageConverter"/>
        </beans:list>
    </beans:property>
</beans:bean>
<!-- Configure bean to convert JSON to POJO and vice versa -->
<beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
</beans:bean>   

因此在上面的代码中,emp对象将直接转换为json作为响应。同样也会发生在帖子上。

答案 4 :(得分:0)

请参阅here

  

已映射请求的消耗性媒体类型,从而缩小了主要映射。

生产者用于缩小主映射,您发送的请求应指定与之匹配的确切标头。