2014-04-22 49 views
4

當我從Chrome Rest Client傳遞應用程序/ json參數時,出現400錯誤請求錯誤。 當我爲@RequestParam添加required = false時,請求被Controller接受,但值爲Null。彈簧控制器不接受應用程序/ json

@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"} 

我試圖用頭= 「接受=應用程序/ 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> 

任何幫助,不勝感激

+0

不是 「surveyName」= 「SD」 應爲 「surveyName」: 「SD」 ? – Prasad

+0

感謝您的快速回復!對不起,這是一個錯字,我將它改爲「surveyName」:「sd」,問題仍然存在 – madhuram2468

+0

發佈日誌跟蹤。 – Prasad

回答

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 

希望這是有用的!

+2

是的,使用地圖。您正在尋找RequestParams,但json中的值不是請求參數,而是請求主體的一部分。 – DavidA

+1

非常感謝。我嘗試了Map和Pojo的方法,都爲我解決了! – madhuram2468

+0

@ madhuram2468不客氣! – gipinani

1

@RequestParam不能用於加載複雜的json對象的部分。它旨在選擇request parameter,但不能在(單個)請求參數中選擇某些內容。

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

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

    ... 
} 

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

或者你也可以在他的answer落實六必居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的實施細則觸發。

如果你喜歡這個答案,那麼請也upvote Biju Kunjummen answer,因爲這是他的想法。我只是看了一下,因爲這是一個有趣的問題。

+0

我試過Container方法,它爲我工作 – madhuram2468

0

也在lib中添加這兩個庫或爲此添加maven。

傑克遜JAXRS-1.6.1.jar

傑克遜映射器-ASL-1.9.9.jar