【问题标题】:Handling REST calls xml response using JAXB使用 JAXB 处理 REST 调用 xml 响应
【发布时间】:2013-11-10 08:37:53
【问题描述】:

我已向“http://services.enterprisecloud.terremark.com/cloudapi/ecloud/organizations/”发送了一个 GET REST 调用,响应为:

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]

在 spring-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 -->

任何关于如何进行的建议都会非常有帮助,因为我已经没有解决这个问题的想法了

【问题讨论】:

    标签: java xml spring rest jaxb


    【解决方案1】:

    您可以尝试将@XmlRootElement(name="Organizations") 添加到ArrayOfOrganizationType,但显然这并不理想,因为您需要在每次重新生成 JAXB 类时重新添加它。

    【讨论】:

    • 好建议,但目前我通过使用我在 Terremark Cloud API 资源管理器中看到的 xml 响应解决了它,然后从这个 xml 生成 xsd(当然这个 xml 在某种意义上是部分的只处理一项操作)。然后我使用这个单一的操作 xsd 来生成 JAXB 类,整个事情与上面发布的 spring-dispatcher 一起工作。
    猜你喜欢
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多