2013-11-10 24 views
1

我打發一個GET REST調用XML響應爲「http://services.enterprisecloud.terremark.com/cloudapi/ecloud/organizations/」,響應是:處理REST調用使用JAXB

HTTP/1.1 200 OK Content-Length: 1373 Content-Type: application/vnd.tmrk.cloud.organization; type=collection x-tmrk-currentuser: /cloudapi/ecloud/admin/users/101 x-tmrk-token: cloud-F2A27F74-C04B-4566-AB53-CCC06DA2F798 Date: Thu, 12 May 2011 19:09:13 GMT 
<Organizations href="/cloudapi/ecloud/organizations" type="application/vnd.tmrk.cloud.organization; type=collection" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
..... 
..... 

有供應商指定的XSD這並沒有產生任何類類型的組織或組織。由JAXB生成的組織相關類是ArrayOfOrganization它看起來像:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "ArrayOfOrganizationType", propOrder = { 
    "organization" 
}) 
public class ArrayOfOrganizationType { 

    @XmlElement(name = "Organization", nillable = true) 
    protected List<OrganizationType> organization; 
.... 
.... 

當我嘗試使用下面的代碼:

ResponseEntity exchange = template.exchange(URL, 
        HttpMethod.GET, 
        new HttpEntity(operation.getInput(), operation.getHeader()), 
        ArrayOfOrganizationType.class, 
        urlVariables); 

我得到的錯誤是:

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [com.trmk.dto.ArrayOfOrganizationType] and content type [application/vnd.tmrk.cloud.organization;type=collection] 

在彈簧dispatcher.xml,我有以下:

<!-- Rest client --> 
<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="restClient" class="com.transport.ext.RestClient"> 
</bean> 

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> 
    <property name="messageConverters"> 
     <list> 
      <bean id="marshallingHttpMessageConverter" 
      class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter" 
      p:marshaller-ref="jaxb2Marshaller" p:unmarshaller-ref="jaxb2Marshaller" 
      p:supportedMediaTypes="application/vnd.tmrk.cloud.organization" /> 
      <bean class="org.springframework.http.converter.StringHttpMessageConverter"/> 
      <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/> 
      <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/> 
     </list> 
    </property> 
</bean> 

<bean id="jaxb2Marshaller" class="com.util.DefaultJaxb2Marshaller"> 
    <property name="classesToBeBound"> 
     <list> 
      <value>java.lang.String</value> 
    <value>com.trmk.dto.ArrayOfOrganizationType</value> 
     </list> 
    </property> 
</bean> 
<!-- End of Rest client --> 

如何進行將是非常有用的,因爲我已經江郎才盡瞭解決這個問題的任何建議

回答

1

你可以嘗試添加@XmlRootElement(name="Organizations")ArrayOfOrganizationType雖然很明顯,這不是理想的,因爲你需要重新添加它的每個你重新生成JAXB類。

+0

好建議,但其時我得到了它通過使用XML響應我的Terremark雲API資源管理器看到,然後生成XSD從這個XML解決(當然這個XML是在這個意義上,它只有一個操作涉及部分)。然後我用這個單一操作XSD生成JAXB類和整個事情的工作原理與彈簧調度張貼以上。 – Sandeep