15.4.1 将 bean 导出为 HTTP 服务

要将 bean 导出为 RMI 服务,我们需要使用 RmiServiceExporter;要将 bean 导出为 Hessian 服务,我们需要使用 HessianServiceExporter;要将 bean 导出为 Burlap 服务,我们需要使用 BurlapServiceExporter。把这种千篇一律的用法带到 HTTP invoker 上,应该也不会有任何意外的事情发生,那就是导出 HTTP invoker 服务,我们需要使 用 HttpInvokerServiceExporter。

为了把 Spitter 服务导出为一个基于 HTTP invoker 的服务,我们需要像下面的配置一样声明一个 HttpInvokerServiceExporter bean:

@Bean
public HttpInvokerServiceExporter httpExportedSpitterService(SpitterService service) {
  HttpInvokerServiceExporter exporter = new HttpInvokerServiceExporter();
  exporter.setService(service);
  exporter.setServiceInterface(SpitterService.class);
  return exporter;
}

是否有点似曾相识的感觉?我们很难找出这个 bean 的定义和那些在 15.3.2 小节中所声明的 bean 有什么不同。唯一的区别在于类名:HttpInvokerServiceExporter。否则的话,这个导出器和其他的远程服务的导出器就没有任何区别了。

如图 15.8 所示,HttpInvokerServiceExporter 的工作方式与 HessianServiceExporter 和 BurlapServiceExporter 很相似。HttpInvokerServiceExporter 也是一个 Spring 的 MVC 控制器,它通过 DispatcherServlet 接收来自于客户端的请求,并将这些请求转换成对实现服务的 POJO 的方法调用。

因为 HttpInvokerServiceExporter 是一个 Spring MVC 控制器,我们需要建立一个 URL 处理器,映射 HTTP URL 到对应的服务上,就像 Hessian 和 Burlap 导出器所做的一样:

@Bean
public HandlerMapping hessianMapping() {
  SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
  Properties mappings = new Properties();
  mappings.setProperty("/spitter.service", "httpExportedSpitterService");
  mapping.setMappings(mappings);
  return mapping;
}

同样,像之前一样,我们需要确保匹配了 DispatcherServlet,这样才能处理对 “*.service” 扩展的请求。参考 15.3.1 小节了解如何设置映射。 我们已经知道如何访问由 RMI、Hessian 或 Burlap 所创建的远程服务,现在我们再次让 Spitter 客户端使用刚才所导出的基于 HTTP invoker 的服务。

Last updated