2014-09-05 212 views
0

我想發送一個json的值從表單標籤到一個Spring MVC控制器。JSON到彈簧控制器

上提交法的形式執行以下代碼

var jsonStr = JSON.stringify($("#form1").serializeArray()); 
    $.ajax({ 
     url : "/DMS/webcontroller/startupload", 
     type : "POST", 
     // traditional : true, 
     contentType : "application/json; charset=utf-8", 
     processData:false, 
     //dataType : "json", 
     data : jsonStr, 
     success : function (response) { 
      alert('success ' + response); 
     }, 
     error : function (response) { 
      alert('error ' + response); 
     }, 
    }); 

我加入以下到我的春天配置XML

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
     <property name="messageConverters"> 
      <list> 
       <ref bean="jsonMessageConverter"/> 
      </list> 
     </property> 
    </bean> 

    <!-- Configure bean to convert JSON to POJO and vice versa --> 
    <bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
    <property name="prefixJson" value="false"/> 
     <property name="supportedMediaTypes" value="application/json"/> 
    </bean> 

我的控制器的簽名如下

@RequestMapping(value="/startupload", method=RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE, produces=MediaType.APPLICATION_JSON_VALUE) 
     public @ResponseBody ReturnData startUpload(@RequestBody UploadStartVO startVO) 
     {... 

當我用firefox 31在tomcat 7上運行這個時,我得到了415響應。如果我檢查th e請求使用工具我看到Content-Type已被添加到請求主體。另外, 請求數據的查詢格式如下:

supplierId=1111&unregSupplier=unregSupplier&customerName=customerName&externalEntity=externalentity&application=scms&logicalGroup=demand&user=u1&password=u1&appUser=appu1&documentType=email&documentDescription=documentDescription&contactPerson=contactPerson&contactNumber=contactNumber&documentGroupName=demand&documentPurpose=documentpurpose&uploaderIP=uploaderIp&uploaderName=scmsname&uploaderCompletePath=somepath%2Fsomepath&uploadDateTime=20%2F12%2F2014 

,而不是像這樣:

[{"name":"supplierId","value":"1111"},{"name":"unregSupplier","value":"unregSupplier"},{"name":"customerName","value":"customerName"},{"name":"externalEntity","value":"externalentity"},{"name":"application","value":"scms"},{"name":"logicalGroup","value":"demand"},{"name":"user","value":"u1"},{"name":"password","value":"u1"},{"name":"appUser","value":"appu1"},{"name":"documentType","value":"email"},{"name":"documentDescription","value":"documentDescription"},{"name":"contactPerson","value":"contactPerson"},{"name":"contactNumber","value":"contactNumber"},{"name":"documentGroupName","value":"demand"},{"name":"documentPurpose","value":"documentpurpose"},{"name":"uploaderIP","value":"uploaderIp"},{"name":"uploaderName","value":"scmsname"},{"name":"uploaderCompletePath","value":"somepath/somepath"},{"name":"uploadDateTime","value":"20/12/2014"}] 

請求體顯示:

Content-Type: application/x-www-form-urlencoded 
Content-Length: 457 

請求頭顯示

Host: localhost:8082 
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Referer: http://localhost:8082/DMS/ 
Cookie: JSESSIONID=C64F21EEECFC5BDF515C3DE22F51626A 
Connection: keep-alive 

如果我編輯這個請求,並在請求中放置json(這是調試期間在jsonStr var中看到的內容)Body更改Body中的Content-Type並在頭中添加Content-Type我得到一個400 Bad Request !

請幫我這個!

編輯:: 所以主要的問題是$ .ajax()沒有創建正確的請求。數據不是json,contenttype不是application/json。

EDIT :: 忘了粘貼的pom.xml扶養

<dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-databind</artifactId> 
      <version>${jackson.databind-version}</version> 
     </dependency> 

EDIT ::: 我試圖所述代碼與去除轉換對象UploadStartVO和ReturnData和與字符串對象替換。調用成功後,ajax()方法仍然返回異常,但表單標記具有適合我的控制器方法的action屬性。任何人都可以指出爲什麼Ajax調用不起作用?使用以下

剛剛嘗試以下一些點,如果仍不能工作的Firefox 31

+0

請試試我的答案,如果它可以幫助您 – 2014-09-05 06:59:15

+0

您正在使用哪個版本的彈簧? – 2014-09-08 05:08:53

+0

4.0.2.RELEASE.jackson 2.3.3 – kavita 2014-09-08 05:10:23

回答

1

看來我是以錯誤的格式向控制器發送數據。我試着一個一個地改變一切。 控制器標題headers = {"Content-type=application/json"}不需要。

控制器中的consumes=MediaType.APPLICATION_JSON_VALUE, produces=MediaType.APPLICATION_JSON_VALUE不需要。

我從2.3.3降級到傑克遜版本的1.9.1。這沒有效果。

我發送最初的數據是

JSON.stringify({'key': 'John', 'application': 'SCMS'}) 

其改爲

JSON.stringify({key: 'John', application: 'SCMS'}) 

請求不是轉化爲POJO正確之後。

希望這可以節省一些人的時間!

0

嘗試。

1.)嘗試contentTypedataType的評論/取消註釋組合。

2.)另請嘗試使用'data:JSON.stringify(jsonStr),'。

3.)還嘗試提醒您的數據。

var jsonStr = $("#form1").serialize(); 
    $.ajax({ 
     url : "/DMS/webcontroller/startupload", 
     type : "POST", 
     contentType : "application/json", 
     data : JSON.stringify(jsonStr), 
     success : function (response) { 
      alert('success ' + response); 
     }, 
     error : function (response) { 
      alert('error ' + response); 
     }, 
    }); 
+0

完成了所有三個!警報是我在調試中看到的。在數據值中進行字符串化仍然會導致錯誤。我還在編輯請求中添加了contenttype標頭。 – kavita 2014-09-05 07:09:39

+0

@kavita確實提醒您顯示您是不是json字符串 – 2014-09-05 07:17:24

+0

Befor請求...是的。我已經粘貼在我的q – kavita 2014-09-05 07:18:42

0

在Spring MVC,輸出JSON數據,你必須在項目類路徑中添加Jackson library

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

<dependency> 
    <groupId>org.codehaus.jackson</groupId> 
    <artifactId>jackson-core-asl</artifactId> 
    <version>1.9.9</version> 
</dependency> 
+0

已添加的依賴關係,但沒有粘貼pom ..版本是2.3.3 – kavita 2014-09-05 07:34:03

+0

@kavita嘗試刪除'consumes = MediaType.APPLICATION_JSON_VALUE,生產= MediaType.APPLICATION_JSON_VALUE','@ RequestBody'就足夠了 – 2014-09-05 08:27:45

+0

刪除。沒有效果! – kavita 2014-09-06 05:06:35

0

嘗試更改代碼consumes = MediaType.APPLICATION_JSON_VALUE with consumes =「application/json」 如果產生響應也會產生相同的錯誤,請執行相同的操作。 最終,如果它不起作用,請嘗試刪除客戶端代碼,在頭文件聲明中使用charset編碼,只留下application/json聲明。

希望這會有所幫助。

乾杯。