2012-03-16 40 views
2

これを解決するために、どこでも検索しました。それは私をナットにしている。@XMLRootElementアノテーションを使用せずにRESTレスポンスを非整列化

私がする必要があるのは、非常に単純なWebサービスの応答を非整列化することだけです。唯一の問題は、@XmlRootElementアノテーションなしで生成されたソースファイルを使用していることです。このソースファイルを編集して@XmlRootElementを追加することはできません。私はそれを「そのまま」使う必要があります。

これは現在のコードですが、この記事の末尾にエラーが表示されています。私はJAXBElementラッパーを使用しようとしましたが、無駄です。誰かが私に必要なコードを教えてもらえますか?私が使用する方法が分からない"QName"sなど

このコードは以下の@XmlRootElementを持つクラスで素晴らしい作品:

MyGeneratedClass response = restTemplate.getForObject("url to webservice!"), 
    MyGeneratedClass.class); 

return response 

悲しいことに、それはこの場合は、このエラーを生成しています。 RESTレスポンスを非整列化するのを手伝ってください!

Could not extract response: no suitable HttpMessageConverter found for response 
    type [MyGeneratedClass] and content type [application/xml;version=1] 

答えて

3

私はこれを数ヶ月前に投稿することを忘れていました。私はおそらくそれを解決する必要があります。 このソリューションは、リクエストヘッダーにクッキーも追加しますが、無視することができます。生成されたソースファイルが@XmlRootElement注釈を持っていない、次のように、あなたが非整列化することができた場合には :

// Cookie setting 
HttpHeaders requestHeaders = new HttpHeaders(); 
requestHeaders.set("Cookie", "myCookie=value"); 
HttpEntity<?> requestEntity = new HttpEntity(requestHeaders); 

HttpEntity<String> response = restTemplate.exchange("web service url"), 
    HttpMethod.GET, requestEntity, String.class); 

// Unmarshalling 
JAXBElement<MyGeneratedClass> result = 
    (JAXBElement<MyGeneratedClass>) unmarshaller.unmarshal(
     new StreamSource(new ByteArrayInputStream(response.getBody().getBytes()))); 

return result.getValue(); 
1

SpringのRestTemplateは、XMLにオブジェクトを非整列化するためにHttpMessageConverterに依存しています。具体的には、表示されているエラーの原因は、Jaxb2RootElementHttpMessageConverter.canWriteメソッドです。 canWriteメソッドをオーバーライドしてXmlRootElementアノテーションが存在するかどうかを気にしなくても、JAXBはオブジェクトをアンマーシャリングできません。

Jaxb2RootElementHttpMessageConverter.canWriteをオーバーライドして、XmlRootElement注釈が存在しないことを確認し、マッピングファイルでEclipseLinkのMoxy JAXB実装を使用することもできます。マッピングファイルでは、XmlRootElementアノテーションに相当するものを指定して、Javaクラスの注釈を使用せずにJAXBを使用できるようにします。

1

SpringのRestTemplateは、一般的にorg.springframework.oxm.jaxb.Jaxb2Marshallerと一緒に使用されています。残念ながら、そのクラスは、プロパティsupportJaxbElementClassは書類どこ:(デフォルトでは、このプロパティをfalseに

春を設定していない、と春のフォーラムにRestTemplate/JAXBElementの程度、多くの疑問が未解決となっている:((((

幸いなことに、あなたはJaxb2Marshallerがtrueにそのプロパティを設定supportJaxbElementClass設定することができます!

RestTemplate意志正しくマーシャルとタイプJAXBElementの

のアンマーシャリングオブジェクトの次の設定例3210
<beans> 
    <bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient"> 
    <constructor-arg> 
     <bean class="org.apache.http.impl.conn.PoolingClientConnectionManager" /> 
    </constructor-arg> 
    </bean> 

    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> 
    <constructor-arg> 
     <bean class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory"> 
     <constructor-arg ref="httpClient" /> 
     </bean> 
    </constructor-arg> 
    <!-- Configure the Rest template to translate between XML and JAXB --> 
    <property name="messageConverters"> 
     <list> 
     <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"> 
      <property name="marshaller" ref="jaxbMarshaller" /> 
      <property name="unmarshaller" ref="jaxbMarshaller" /> 
     </bean> 
     <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>   
     </list> 
    </property> 
    </bean> 
    <bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
    <property name="supportJaxbElementClass" value = "true"/> 
    <property name="packagesToScan"> 
     <list> 
     <value>com.myorg.path.to.JAXB.classes</value> 
     </list> 
    </property> 
    </bean> 
</beans> 
関連する問題