0

XMLを入力として受け取るWebサービスでSpringを使用しています。これは、HTTPリクエストにXMLで埋め込むことも、リクエスト属性にプレーンテキストとして埋め込むこともできます。

現在、私のWebサービスは2つの異なるXMLスキーマを処理しているため、アンマーシャラーはXMLファイルを2つのオブジェクトタイプ(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オブジェクトまたはBarオブジェクトにアンマーシャルできるリクエスト文字列を使用します。

問題は、埋め込まれたXMLにあります。

@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:HTTPパス'/ws/mypath.ws'にマップされたあいまいなハンドラーメソッド:[...]複数のメソッドで同じパスを処理する場合は、それらを専用のハンドラークラスに分解します。タイプレベルでマップされたパス!

@RequestBody異なるオブジェクトタイプに自動的にアンマーシャルするにはどうすればよいですか?(同じWebサービスパスを使用

4

1 に答える 1

0

各リクエストメソッドを一意にする何かが必要です。この@RequestMapping場合、両方のxmlベースのリクエストマッピングはまったく同じです。フレームワークが。を使用して正しいメソッドを見つけた後、パラメータのタイプが把握されます@RequestMapping。したがって、フレームワークが正しいメソッドを見つけるのに役立つアノテーションにさらに何かがない限り、基本的にあなたが言っていることは実行可能ではありません。

Spring 3.1以降を使用している場合、簡単にできることの1つは次のとおりです。

@RequestMapping(value={"/mypath"}, method={RequestMethod.POST}, consumes=text/xml)
于 2013-01-08T12:49:53.070 に答える