Контроллер Spring не принимает приложение/json

Когда я передаю параметры приложения/json из Chrome Rest Client, я получаю ошибку 400 неверных запросов. Когда я добавляю required=false для @RequestParam, контроллер принимает запрос, но значения равны 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 — «application/json».

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

Я пробовал использовать headers="Accept=application/json", но это мало помогло.

Мой диспетчер-сервлет

<?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>

Любая помощь очень ценится


person madhuram2468    schedule 22.04.2014    source источник
comment
Разве SurveyName=sd не должно быть SurveyName:sd?   -  person Prasad    schedule 22.04.2014
comment
Спасибо за быстрый ответ !! Извините, это была опечатка, я изменил его на SurveyName:sd, и проблема все еще сохраняется.   -  person madhuram2468    schedule 23.04.2014


Ответы (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

Надеюсь, это может быть полезно!

person gipinani    schedule 22.04.2014
comment
Да, используйте карту. Вы ищете RequestParams, но значения в json не являются параметрами запроса, а являются частью тела запроса. - person DavidA; 23.04.2014
comment
Большое спасибо. Я попробовал и метод Map, и метод Pojo, и оба они сработали для меня! - person madhuram2468; 23.04.2014
comment
Скажите, пожалуйста, как передать дату, я использовал переменную Date в своем классе Pojo, например private java.util.Date SurveyDate, когда я передаю JSON как {surveyName: 1, SurveyDesc: 123, SurveyDate: 01-01-2014}. Я попытался добавить аннотацию @DateTimeFormat(pattern=MM-DD-YYYY), но это мало помогло. - person madhuram2468; 23.04.2014
comment
@madhuram2468 Взгляните сюда: blog.seyfi .net/2010/03/how-to-control-date-formatting-when.html - person gipinani; 23.04.2014
comment
Спасибо .. Это сработало для меня после использования как @JsonSerialize(using = CustomDateSerializer.class), так и @JsonDeserialize(using = CustomDateDeserializer.class) - person madhuram2468; 24.04.2014

@RequestParam нельзя использовать для загрузки частей сложного объекта json. Он предназначен для выбора параметра запроса, но не чтобы выбрать что-то в пределах (одного) параметра запроса.

Вам нужно использовать @RequestBody и объект-контейнер

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

  ...
}

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

Или вы можете реализовать решение, описанное Biju Kunjummen в его ответе на аналогичный вопрос. Идея состоит в том, чтобы реализовать собственный HandlerMethodArgumentResolver, который запускается аннотацией параметра, принимающей аргумент выражения JsonPath

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

Взгляните на Передача нескольких переменных в @RequestBody контроллеру Spring MVC с использованием Ajax для деталей реализации.

Если вам нравится этот ответ, пожалуйста, также проголосуйте за ответ Biju Kunjummen, потому что это его идея. Я немного погуглил, потому что это интересный вопрос.

person Ralph    schedule 22.04.2014

также добавьте эти две библиотеки в lib или добавьте для этого maven.

Джексон-jaxrs-1.6.1.jar

Джексон-маппер-ASL-1.9.9.jar

person subhash lamba    schedule 23.04.2014