【发布时间】: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