29.2. 使用注入注入代理
概述
通过 Apache CXF 使用 Spring Framework,可以避免使用 JAX-WS API 创建服务代理。它允许您在配置文件中定义客户端端点,然后将代理直接注入到实施代码中。当运行时实例化实现对象时,也会根据配置为外部服务实例化代理。通过引用实例化代理来手动实现这个实现。
由于代理使用配置文件中的信息实例化,因此不需要硬编码 WSDL 位置。它可以在部署时更改。您还可以指定运行时应该搜索 WSDL 的类路径。
流程
要将外部服务的代理注入到服务提供商的实现中,请执行以下操作:
配置代理
您可以使用应用配置文件中的 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
对象。您可以使用此对象在代理的外部服务上调用。