从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
人生贵得适意尔,何能羁官数千里以要名爵