2012-06-19 71 views
1

我有一個簡單的Spring程序,後端是Spring MVC和Restful web服務,前端是純HTML + ajax。如何排查spring mvc映射問題?

我的問題是,當我嘗試使用下面的HTTP請求參數映射到一個POJO,它總是失敗:

@RequestMapping(value = "/books", method = RequestMethod.PUT) 
    public @ResponseBody 
    String updateBook(BookInfo book) 

這裏我使用PUT方法,因爲它是一個修改操作。沒有例外,但我沒有注入書本對象。

用相同的HTTP請求參數,如果我改變了方法POST,和客戶端通過POST發送,這將是成功的:

@RequestMapping(value = "/books", method = RequestMethod.POST) 
public ResponseEntity<String> addBook(BookInfo book) 

這次本書總是會得到填補。

爲什麼PUT和POST有區別?或者它是返回類型的問題? (一個是ResponseBody,另一個是ResponseEntity)?或者,如果您使用PUT,那麼pojo必須處於持久性上下文中?

我該如何調查該問題?

回答

0

我認爲它不是你的配置或代碼的問題。 在Spring框架中,提供了一個名爲HiddenHttpMethodFilter的過濾器,該過濾器服務於所有方法,但最初它將執行POST請求,但是具有隱藏的表單字段。這個過濾器讀取這個隱藏的字段值,然後相應地更改方法值。請參閱this link以瞭解更多信息。我認爲使用此過濾器進行配置可以解決您的問題。

希望這可以幫助你。乾杯。

+0

嗨,感謝您的技巧。我會試一試並反饋。 –

+0

不客氣。我很確定這會解決你的問題。但我建議你一次通過我提供的鏈接。 :-) –

+0

結果是一個真正的映射問題,在客戶端,我應該使用dojo.xhrPut({url:'path/to/resource',putData:data,headers:{...「application/json 「},並且在服務器端,我應該在映射的bean之前添加@requestBody,以確保spring從url以外的請求主體進行映射。完成這個更改後,PUT方法可以工作。但是,我仍在研究什麼是dojo.xhrPut({putData:data})和dojo.xhrPut({content:data})之間的區別,聽起來像是這個問題 –