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サービスパスを使用)