从DefaultStrategiesHelper 开始分解spring-ws-core的实现

DefaultStrategiesHelper 开始分解spring-ws-core的实现

在spring-ws-core项目中,developer需要关注的,核心关键的有两个类WebserviceTemplateMessageDispatcher. 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 后,用户需要主动调用 WebServiceGatewaySupportsetMarshaller(Marshaller) 方法,便于后续 marshalSendAndReceive() 请求时使用 Marshaller

WebserviceTemplate 运行生命周期

核心逻辑实现在sendAndReceive(String uriString, WebServiceMessageCallback requestCallback, WebServiceMessageExtractor<T> responseExtractor)方法里。具体来说,主要有一下几步:

  1. 调用 createConnection(),建立 http 连接.
  2. 根据前面配好的 WebServiceMessageFactory 调用 createWebServiceMessage() 创建请求消息.
  3. 如果配置了requestCallback 的话, 调用 doWithMessage() 修饰请求消息.
  4. 如果配置了拦截器的话,链式调用,分别处理请求消息;如果没有配置拦截器的话,直接跳到第七步
  5. 正式向远端发起 send 请求.
  6. 调用 hasError() 检测是否连接出现错误。如果出现错误的话,会检测是否为 SOAP fault
    • 如果连接出现问题的话, 调用 handleError() 方法,该方法默认抛出 WebServiceTransportException
    • 如果没有错误的话,直接进入下一步
  7. 读取响应信息
    • 没有相应的话,返回 null 或 false
    • 调用 hasFault() 确定响应中含有错误。如果有的话,调用 lientInterceptor.handleFault(MessageContext) 和 the handleFault() 方法
    • 其它情况下,调用 ClientInterceptor.handleResponse(MessageContext) and extractData() 或者在 response callback 中的 doWithMessage() 方法
  8. 关闭连接

MessageDispatcher

Basic MVC flow

MessageDispatcherServlet —> MessageDispatcher(WebserviceMesageReceiver)

spring-ws

MessageDispatcher Logic

MessageDispatcher

by neo

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值