【问题标题】:Handling multiple Rest web services using Spring and Castor使用 Spring 和 Castor 处理多个 Rest Web 服务
【发布时间】:2012-11-26 16:53:13
【问题描述】:

谁能告诉我使用 Springs RestTemplate 处理对多个 Rest Web 服务的访问的最佳方式?

我知道 RestTemplate 对象有一个消息转换器引用 (MarshallingHttpMessageConverter),而后者又引用了一个 unmarshaller。就我而言,我正在使用带有关联映射文件的 Spring Frameworks CastorMarshaller 对象。

通常我可以将所有映射添加到一个 Castor 映射文件中。然而,在我的例子中,所有的 Web 服务都是这种格式(下面的块), 根据调用的服务持有不同的实体。

<data>
<output>
    <dataset>
        <row id="" .... />
        <row id="" .... />
        <row id="" .... />
        <row id="" .... />
        <row id="" .... />
    </dataset>
</output>
<nextUpdate><nextUpdate/> 
</data>

CastorMarshaller 被注入到 MessageConverter 中,而 MessageConverter 本身被注入到应用程序上下文配置文件中的 RestTemplate 中。

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
                <property name="marshaller" ref="castorMarshaller"/>
                <property name="unmarshaller" ref="castorMarshaller"/>
                <property name="supportedMediaTypes">
                    <list>
                        <bean class="org.springframework.http.MediaType">
                            <constructor-arg index="0" value="application"/>
                            <constructor-arg index="1" value="xml"/>
                        </bean>                     
                        <bean class="org.springframework.http.MediaType">
                            <constructor-arg index="0" value="text"/>
                            <constructor-arg index="1" value="xml"/>
                        </bean>     
                    </list>
                </property>

            </bean>

        </list>
    </property>                 
</bean>

<bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller">
    <property name="mappingLocation" value="classpath:oxm-mapping-worldweather.xml"/>
</bean> 

我一直在考虑的可能选项:

1 为每个 Rest 服务创建多个RestTemplates

2 为不同的服务创建多个MessageConverters,并在访问不同的服务时更改模板上的消息转换器。

3 为不同的服务创建多个CasterMarshaller 对象,并使用新的unmarshaller 更新消息转换器

用相同的根元素和子元素处理这样的多个服务的最佳方法是什么?

提前致谢 斯曼英国

【问题讨论】:

  • 我不确定我是否完全理解这个问题。问题是您只在 CasterMarshaller 中指定一个映射文件吗?我对 Castor 了解不多,但仅浏览他们的 javadocs 似乎表明一种在其上下文中包含多个映射文件的方法:createXMLContext(Resource[] mappingLocations, Class targetClass)
  • 我是 castor 新手,但文档建议您可以使用类似 mapping.loadMapping(new InputSource(getClass().getClassLoader().getResourceAsStream("mapping1.xml")));并为不同的映射文件多次调用

标签: web-services spring rest spring-mvc castor


【解决方案1】:

如果指定多个映射文件是问题,那么下面是解决方案。

使用 mappingLocations 属性而不是下面给出的 mappingLocation,

<bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller">
    <property name="mappingLocations">
        <list>
            <value>classpath:oxm-mapping-worldweather.xml</value>
            <value>classpath:sample-mapping.xml</value>
        </list>
    </property>
</bean> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 2015-05-13
    相关资源
    最近更新 更多