2013-01-08 61 views
0

我用它接收XML作爲輸入我的web服務春天。它可以是XML在HTTP請求或作爲請求屬性明文embebed。如何對不同的@RequestBody對象類型解組?

目前我的web服務處理兩個不同的XML模式,所以我的解組可以在XML文件解組兩種對象類型(例如:Foo和Bar)。

在我的控制,我有一個代碼,以處理程序要求屬性:

@RequestMapping(value={"/mypath"}, method={RequestMethod.POST}, headers={"content-type=application/x-www-form-urlencoded"}) 
@ResponseBody 
public ResponseObject getResponse(@RequestParam("request") String request, HttpServletRequest req) { 

它完美,與請求字符串我可以解組到Foo對象或酒吧對象。

問題自帶的XML embebed:

@RequestMapping(value={"/mypath"}, method={RequestMethod.POST}, headers={"content-type=text/xml"}) 
@ResponseBody 
public ResponseObject getResponse(@RequestBody Foo request, HttpServletRequest req) { 

@RequestMapping(value={"/mypath"}, method={RequestMethod.POST}, headers={"content-type=text/xml"}) 
@ResponseBody 
public ResponseObject getResponse(@RequestBody Bar request, HttpServletRequest req) { 

而這裏的MessageConverter:

<bean id="marshallingHttpMessageConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"> 
    <property name="marshaller" ref="jaxb2Marshaller" /> 
    <property name="unmarshaller" ref="jaxb2Marshaller" /> 
</bean> 
<oxm:jaxb2-marshaller id="jaxb2Marshaller" contextPath="path.to.Foo:path.to.Bar"/> 

我認爲的MessageConverter應該自動地做和解組但是我收到一個錯誤:

java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path '/ws/mypath.ws': [...] If you intend to handle the same path in multiple methods, then factor them out into a dedicated handler class with that path mapped at the type level!

如何自動解除對不同的@RequestBody對象類型的解組? (具有相同的Web服務路徑

回答

0

必須有東西在@RequestMapping都基於XML請求映射完全相同,這使得每一個請求方法獨特,你的情況 - 該參數的類型是想通了在框架找到與@RequestMapping正確的方法後。所以,基本上你所說的是不可行的,除非你在註解中有更多的東西來幫助框架找到正確的方法。

一個小的簡化,你可以做如下,如果你是在春天3.1+:

@RequestMapping(value={"/mypath"}, method={RequestMethod.POST}, consumes=text/xml) 
+0

好了,感謝您的澄清。在這種情況下,我不能有兩個不同的'@ RequestMapping',所以我必須在這裏改變我的方法。我認爲最好的方式來「解決」,這是[使用HttpServletRequest對象(http://stackoverflow.com/questions/7476372/alternative-of-requestbody)來獲取輸入流,但我失去自動的在和解組functionallity。 – ilazgo