2011-02-25 620 views
5

我想要在POST的身體,我想我的方法的參數綁定到一個對象。一起使用@RequestBody和@ModelAttribute?

這可能嗎?

我現在聲明就都不曾打:

@RequestMapping(method = RequestMethod.POST) 
public void doStuff(@RequestBody byte[] bodyData, @ModelAttribute Form form, Model model) { 

看起來像我得到這個異常:

- 2011-02-25 16:57:30,354 - ERROR - http-8080-3 - org.springframework.web.portle 
t.DispatcherPortlet - Could not complete request 
java.lang.UnsupportedOperationException: @RequestBody not supported 
+0

你有你的@Controller和@RequestMapping註解嗎? – GriffeyDog 2011-02-25 17:03:26

+0

難道你試圖讓@RequestBody變量中的POST正文和@ModelAttribute變量中的GET參數? – 2011-02-25 17:49:58

+0

@three_cups_of_java:是的。 – 2011-02-25 20:22:43

回答

6

爲了使其正常工作,你必須確保你」重新使用AnnotationMethodHandlerAdapter。這覆蓋了HandlerMethodInvoker'screateHttpInputMessage(這是拋出你看到的異常)。 (它這樣做是在一個私人類)。

我相信你可以只在您的* -servlet.xml後綴以下

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/> 

警告:下面的答案是需要@RequestBody的情況和@RequestParam在相同的處理程序方法中。它不回答這個問題,但可能對某人有用。

我已經用Spring 3.0.1測試過了。這是可能的,但它有些不穩定。你必須在你的@RequestParam參數之前有你的@RequestBody方法參數。我猜這是因爲HandlerMethodInvoker在檢索參數時(和請求主體只能被讀取一次)讀取請求主體(以及GET參數)。

下面是一個例子(警告:在斯卡拉我的代碼,所以我沒有編譯這個Java代碼)

@RequestMapping(value = "/test", method = RequestMethod.POST) 
public String test(
     @RequestBody String body, 
     @RequestParam("param1") String parma1, 
     Map<Object, Object> model: Map[AnyRef, AnyRef]) 
{ 
    model.put("test", test) 
    model.put("body", body) 

    return "Layout" 
} 

另一種方法是使用@PathVariable。我已經證實這是有效的。

+1

在閱讀本文時,我注意到我沒有添加分號。我不打算編輯它以顯示我不喜歡在Scala中輸入它們:) – 2011-02-28 16:03:03

+0

我敢打賭,我的配置中沒有這個定義。我稍後會測試一下以確認。我在Groovy中使用了很多代碼,所以我也是非分號的粉絲:P。我不明白它如何在Scala而不是Java中工作。 – 2011-02-28 17:30:44

1

不幸的是,這是不可能的。如果您使用Spring MVC的Portlet版本(並且它看起來像來自日誌),那麼您可能對this JIRA issue感興趣。

AnnotationMethodHandlerAdapter在內部使用PortletHandlerMethodInvoker,第二個是HandlerMethodInvoker的內部子類 - 您可以在其中配置HttpMessageConverter-s的位置。但他們被設置爲空。財產是最終的。

,即使是要解決,如果你能代替HandlerMethodInvoker,但你不能。它的構造函數創建;)

有一點要注意的是,Spring MVC中的Servlet的版本完全支持HttpMessageConverter-S和不不會遇到這個問題。