Spring控制器不接受application / json

时间:2014-04-22 19:16:35

标签: spring spring-mvc http-status-code-404 rest-client

当我从Chrome Rest Client传递application / json参数时,我收到400错误请求错误。 当我为@RequestParam添加required = false时,Controller接受请求,但值为Null。

@RequestMapping(value = "/add",
                method = RequestMethod.POST,
                consumes="application/json",
                produces="application/json")
public @ResponseBody String add(
  @RequestParam(value="surveyName") String surveyName,
  @RequestParam(value="surveyDesc")  String surveyDesc,
  ModelMap model) throws Exception
{
    System.out.println("request parameters in /add/syrvey surveyName= "+surveyName);
}

我的JSON请求如下,Content-Type是“aplication / json”

{"surveyName"="sd", "surveyDesc":"sd"}

我尝试使用headers =“Accept = application / json”,但它没有多大帮助。

我的调度程序 - servlet是

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=">
    <context:annotation-config />
    <context:component-scan base-package="com.survey.controller" />
    <context:component-scan base-package="com.survey.service" />
    <context:component-scan base-package="com.survey.dao" />
    <context:component-scan base-package="com.survey.entity" />
    <context:component-scan base-package="com.survey.constants" />
    <mvc:annotation-driven />
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
    <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="jacksonMessageConverter" />
            </list>
        </property>
    </bean>
</beans>

我的pom.xml是

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.12</version>
</dependency>

任何帮助非常感谢

3 个答案:

答案 0 :(得分:3)

在您的情况下,您可以使用Map

public @ResponseBody String add(@RequestBody Map<String, String> input) throws Exception

然后迭代它以找到您的参数,或者您可以使用Pojo

public class Pojo {
    private String surveyName;
    private String surveyDesc;

    ...
}

public @ResponseBody String add(@RequestBody Pojo pojo) throws Exception

希望这有用!

答案 1 :(得分:1)

@RequestParam不能用于加载复杂json对象的部分。它旨在选择request parameter,但不选择(单个)请求参数中的内容。

您需要使用@RequestBody和容器对象

public class MyContainer {
  private String surveyName;
  private String surveyDesc;

  ...
}

public @ResponseBody String add(@RequestBody Container container){...}

或者您可以在他的answer中针对类似问题实施Biju Kunjummen所描述的解决方案。我们的想法是实现由参数注释触发的自己的HandlerMethodArgumentResolver,它带有一个JsonPath表达式参数

public @ResponseBody String add(
    @JsonArg("/surveyName") String surveyName,
    @JsonArg("/surveyDesc")  String surveyDesc){...}

查看Passing multiple variables in @RequestBody to a Spring MVC controller using Ajax了解实施细节。

如果你喜欢这个答案,那么请同时赞成Biju Kunjummen answer,因为这是他的想法。我只是因为这是一个有趣的问题而瞪眼了。

答案 2 :(得分:0)

还在lib中添加这两个库或为此添加maven。

杰克逊 - JAXRS-1.6.1.jar

杰克逊映射器-ASL-1.9.9.jar