2012-03-16 38 views
2

好吧,我到處搜索了一個答案。這讓我瘋狂。在不使用@XMLRootElement註釋的情況下解組一個REST響應

我只需要解組一個非常簡單的webservice響應。唯一的問題是,我正在使用不帶@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

我忘記了幾個月前發佈的內容,我應該跟着解決方案。 該解決方案還向請求標題添加了一個cookie,但您可以忽略它。 在一個生成的源文件沒有@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's RestTemplate依靠HttpMessageConverter將對象解組爲XML。更具體地說,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其財產supportJaxbElementClass設置爲true!

RestTemplate的下面的示例配置將正確馬歇爾和類型的JAXBElement的解讀對象

<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> 
相關問題