29.2. 使用注入注入代理

概述

通过 Apache CXF 使用 Spring Framework,可以避免使用 JAX-WS API 创建服务代理。它允许您在配置文件中定义客户端端点,然后将代理直接注入到实施代码中。当运行时实例化实现对象时,也会根据配置为外部服务实例化代理。通过引用实例化代理来手动实现这个实现。

由于代理使用配置文件中的信息实例化,因此不需要硬编码 WSDL 位置。它可以在部署时更改。您还可以指定运行时应该搜索 WSDL 的类路径。

流程

要将外部服务的代理注入到服务提供商的实现中,请执行以下操作:

  1. 在应用程序可以访问的已知位置部署所需的 WSDL 文档。

    注意

    如果您要将应用程序部署为 WAR 文件,建议您将所有 WSDL 文档和 XML 架构文档放在 WAR WEB-INF/wsdl 文件夹中。

    注意

    如果您要将应用程序部署为 JAR 文件,建议将所有 WSDL 文档和 XML 架构文档放在 JAR 的 META-INF/wsdl 文件夹中。

  2. 正在注入的代理配置 JAX-WS 客户端端点。
  3. 使用 @Resource 注释,将代理 注入到 您的服务提供。

配置代理

您可以使用应用配置文件中的 jaxws:client 元素配置 JAX-WS 客户端端点。这会告知运行时,使用指定属性实例化 org.apache.cxf.jaxws.JaxWsClientProxy 对象。此对象是注入到服务供应商中的代理。

您至少需要为以下属性提供值:

  • id- 表示用于标识要注入的客户端的 ID。
  • serviceClass- 表示代理发出请求的服务的 SEI。

例 29.1 “配置将代理注入服务实施中” 显示 JAX-WS 客户端端点的配置。

例 29.1. 配置将代理注入服务实施中

<beans ...
  xmlns:jaxws="http://cxf.apache.org/jaxws"
  ...
  schemaLocation="...
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
    ...">
  <jaxws:client id="bookClient"
                serviceClass="org.apache.cxf.demo.BookService"
                wsdlLocation="classpath:books.wsdl"/>
  ...
</beans>
注意

例 29.1 “配置将代理注入服务实施中” wsdlLocation 属性中,指示运行时从类路径加载 WSDL。如果 book.wsdl 位于 classpath 上,则运行时将能够找到它。

有关配置 JAX-WS 客户端的详情请参考 第 17.2 节 “配置 Consumer 端点”

对供应商实施进行编码

您可以使用 @Resource,将配置的代理注入服务实现中,如 例 29.2 “将代理注入服务实现” 所示。

例 29.2. 将代理注入服务实现

package demo.hw.server;

import org.apache.hello_world_soap_http.Greeter;

@javax.jws.WebService(portName = "SoapPort", serviceName = "SOAPService",
                      targetNamespace = "http://apache.org/hello_world_soap_http",
                      endpointInterface = "org.apache.hello_world_soap_http.Greeter")
public class StoreImpl implements Store {

@Resource(name="bookClient") private BookService proxy;

}

该注释的 name 属性对应于 JAX-WS 客户端的 id 属性的值。配置的代理注入注解后立即声明的 BookService 对象。您可以使用此对象在代理的外部服务上调用。