从DefaultStrategiesHelper 开始分解spring-ws-core的实现
在spring-ws-core项目中,developer需要关注的,核心关键的有两个类WebserviceTemplate和MessageDispatcher. WebserviceTemplate主要作为Client负责同远端的WebService Endpoint交互,而MessageDispatcher类似于Spring MVC中的核心类DispatcherServlet主要负责将远端的信息分发到具体的handler处理,并返回response。
DefaultStrategiesHelper
DefaultStrategiesHelper 是一个辅助的工具类,主要解决接口同默认实现的绑定问题,作为一种fallback,其要实现的目的同ServiceLoader类似。DefaultStrategiesHelper提供三种构造函数。分别为:
// 接受K-V对的形式。其中K为接口全称,V为实现类全称
public DefaultStrategiesHelper(Properties defaultStrategies) {
Assert.notNull(defaultStrategies, "defaultStrategies must not be null");
this.defaultStrategies = defaultStrategies;
}
// spring wrapper of file, could be ClassPathResource or FileSystemResource or UrlResource
public DefaultStrategiesHelper(Resource resource) throws IllegalStateException {
try {
defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
}
catch (IOException ex) {
throw new IllegalStateException("Could not load '" + resource + "': " + ex.getMessage());
}
}
// 类短名.properties的形式。spring-ws-core中采用这种形式
public DefaultStrategiesHelper(Class<?> type) {
this(new ClassPathResource(ClassUtils.getShortName(type) + ".properties", type));
}
具体来说在spring container启动时,会加载相应的properties文件,然后通过 getDefaultStrategies(Class<T> strategyInterface, ApplicationContext applicationContext)方法,实例化策略接口的实现,并模拟作为bean的相应的生命周期
WebserviceTemplate
WebserviceTemplate 核心部件
- 默认组件
查找 WebserviceTemplate.properties 文件,可知 WebserviceTemplate 类使用到的默认strategy接口主要有FaultMessageResolver, WebServiceMessageFactory, WebServiceMessageSender. 目前默认的 WebServiceMessageFactory 实现为org.springframework.ws.soap.saaj.SaajSoapMessageFactory, 另外一种实现为AxiomSoapMessageFactory. 默认的WebServiceMessageSender实现为org.springframework.ws.transport.http.HttpUrlConnectionMessageSender, 根据类名我们可知spring-ws默认采用原生的j2se的HttpUrlConnection去向远端webservice接口发起POST请求,如果有更加精细的要求控制的话,官方文档推荐我们选用 apache HttpClient实现的HttpComponentsMessageSender类。
- 用户配置组件
如果用户适用 marshalSendAndReceive(…) 方法,需要配置 Marshaller,具体配置如下
@Bean
public Jaxb2Marshaller marshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
// this package must match the package in the <generatePackage> specified in
// pom.xml
marshaller.setContextPath("country.wsdl");
return marshaller;
}
定义 Marshaller bean 后,用户需要主动调用 WebServiceGatewaySupport 的 setMarshaller(Marshaller) 方法,便于后续 marshalSendAndReceive() 请求时使用 Marshaller
WebserviceTemplate 运行生命周期
核心逻辑实现在sendAndReceive(String uriString, WebServiceMessageCallback requestCallback, WebServiceMessageExtractor<T> responseExtractor)方法里。具体来说,主要有一下几步:
- 调用 createConnection(),建立 http 连接.
- 根据前面配好的 WebServiceMessageFactory 调用 createWebServiceMessage() 创建请求消息.
- 如果配置了requestCallback 的话, 调用 doWithMessage() 修饰请求消息.
- 如果配置了拦截器的话,链式调用,分别处理请求消息;如果没有配置拦截器的话,直接跳到第七步
- 正式向远端发起 send 请求.
- 调用 hasError() 检测是否连接出现错误。如果出现错误的话,会检测是否为 SOAP fault
- 如果连接出现问题的话, 调用 handleError() 方法,该方法默认抛出 WebServiceTransportException
- 如果没有错误的话,直接进入下一步
- 读取响应信息
- 没有相应的话,返回 null 或 false
- 调用 hasFault() 确定响应中含有错误。如果有的话,调用 lientInterceptor.handleFault(MessageContext) 和 the handleFault() 方法
- 其它情况下,调用 ClientInterceptor.handleResponse(MessageContext) and extractData() 或者在 response callback 中的 doWithMessage() 方法
- 关闭连接
MessageDispatcher
Basic MVC flow
MessageDispatcherServlet —> MessageDispatcher(WebserviceMesageReceiver)

MessageDispatcher Logic

by neo
人生贵得适意尔,何能羁官数千里以要名爵

本文深入探讨了spring-ws-core项目中的两个核心组件WebserviceTemplate和MessageDispatcher的工作原理及其实现细节。WebserviceTemplate作为客户端负责与远程WebServiceEndpoint交互,而MessageDispatcher则负责分发请求并返回响应。
3万+

被折叠的 条评论
为什么被折叠?



