43.10. 配置端点以使用处理程序
43.10.1. 程序配置
43.10.1.1. 将处理程序链添加到消费者
概述
向使用者添加处理程序链涉及明确构建处理程序链。然后,直接在服务代理的 Binding
对象中设置处理器链。
使用 Spring 配置配置的任何处理器链都会覆盖配置了 programmaticaly 的处理程序链。
流程
在您可以执行以下操作的使用者中添加处理器链:
-
创建
List<Handler&
gt; 对象来保存处理程序链。 - 创建将添加到该链的每个处理程序的实例。
- 按照运行时需要调用的顺序将每个实例化的处理程序对象添加到列表中。
从服务代理获取 Binding 对象。
Apache CXF 提供名为
org.apache.cxf.jaxws.binding.DefaultBindingImpl
的 Binding 接口的实施。-
使用 Binding 对象的
setHandlerChain ()
方法,设置代理上的处理程序链。
示例
例 43.14 “将处理程序链添加到消费者” 显示将处理程序链添加到消费者的代码。
例 43.14. 将处理程序链添加到消费者
import javax.xml.ws.BindingProvider; import javax.xml.ws.handler.Handler; import java.util.ArrayList; import java.util.List; import org.apache.cxf.jaxws.binding.DefaultBindingImpl; ... SmallNumberHandler sh = new SmallNumberHandler(); List<Handler> handlerChain = new ArrayList<Handler>(); handlerChain.add(sh); DefaultBindingImpl binding = ((BindingProvider)proxy).getBinding(); binding.getBinding().setHandlerChain(handlerChain);
例 43.14 “将处理程序链添加到消费者” 中的代码执行以下操作:
实例化处理程序。
创建用于存放链的列表对象。
将处理程序添加到 链。
从代理获取 Binding 对象作为 DefaultBindingImpl
对象。
将处理程序链分配给代理的绑定。
43.10.1.2. 在服务提供商中添加处理程序链
概述
您可以通过调整 SEI 或实施类及 @HandlerChain
注释来向服务提供商添加处理程序链。该注释指向一个 meta-data 文件,该文件定义供服务提供商使用的处理程序链。
流程
在您进行以下的服务提供商中添加处理器链:
-
使用
@HandlerChain
注释声明提供程序的实施类。 - 创建定义处理程序链的处理程序配置文件。
@HandlerChain 注释
javax.jws.HandlerChain
注解 decorates 服务提供商的实施类。它指示运行时加载由其 file
属性指定的处理程序链配置文件。
该注解的 file
属性支持通过两种方法来识别要加载的处理程序配置文件:
- a URL
- 相对路径名称
例 43.15 “加载处理程序链的服务实施” 显示一个服务提供商实施,它将使用名为 handlers.xml
的文件中定义的处理程序链。handlers.xml
必须位于运行服务提供商的目录中。
例 43.15. 加载处理程序链的服务实施
import javax.jws.HandlerChain;
import javax.jws.WebService;
...
@WebService(name = "AddNumbers",
targetNamespace = "http://apache.org/handlers",
portName = "AddNumbersPort",
endpointInterface = "org.apache.handlers.AddNumbers",
serviceName = "AddNumbersService")
@HandlerChain(file = "handlers.xml")
public class AddNumbersImpl implements AddNumbers
{
...
}
处理器配置文件
处理程序配置文件使用 XML grammar 定义处理程序链,该链附带 JSR 109 (Java EE 版本 1.2 的 Web 服务)。这个 grammar 在 http://java.sun.com/xml/ns/javaee
中定义。
处理程序配置文件的 root 元素是 handler-chains
元素。handler-chains
元素具有一个或多个 handler-chain
元素。
handler-chain
元素定义处理程序链。表 43.1 “用于定义 Server-Side Handler 链的元素” 描述 handler-chain
元素的子项。
element | 描述 |
---|---|
包含描述处理程序的元素。 | |
指定 WSDL | |
指定 WSDL | |
指定使用 handler 链的消息绑定。该绑定被指定为 URI,或使用以下别名之一: 有关消息绑定 URI 的更多信息,请参阅 第 23 章 Apache CXF Binding ID。 |
handler-chain
元素只需要将单个 handler
元素作为子项。但是,它可以根据需要支持任意数量的 处理程序
元素来定义完整的处理程序链。链中的处理程序按照处理程序链定义中指定的顺序执行。
执行最终顺序将通过将指定处理程序排序为逻辑处理程序和协议处理程序来确定。在分组中,将使用配置中指定的顺序。
协议绑定
等其他子项用于限制定义的处理程序链的范围。例如,如果您使用 service-name-pattern
元素,处理程序链将只附加到服务提供程序,而 WSDL 端口
元素是指定的 WSDL 服务
元素的子供应商。您只能使用这些限制的子项在 handler
元素中。
handler
元素在处理程序链中定义各个处理程序。其 handler-class
子元素指定实施该处理程序的类完全限定名称。handler
元素也可以具有可选 handler-name
元素,它指定处理程序的唯一名称。
例 43.16 “处理器配置文件” 显示定义单一处理程序链的处理程序配置文件。该链由两个处理程序组成。
例 43.16. 处理器配置文件
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee"> <handler-chain> <handler> <handler-name>LoggingHandler</handler-name> <handler-class>demo.handlers.common.LoggingHandler</handler-class> </handler> <handler> <handler-name>AddHeaderHandler</handler-name> <handler-class>demo.handlers.common.AddHeaderHandler</handler-class> </handler> </handler-chain> </handler-chains>
43.10.2. Spring 配置
概述
将端点配置为使用处理程序链的最简单方法是在端点配置中定义链。这可以通过将 jaxwxs:handlers
子添加到配置端点的元素来实现。
通过配置文件添加的处理程序链优先于编程配置的处理程序链。
流程
要配置端点来加载处理器链,您可以进行以下操作:
如果端点还没有配置元素,请添加它。
有关配置 Apache CXF 端点的更多信息,请参阅 第 17 章 配置 JAX-WS 端点。
-
添加
jaxws:handlers
子元素到端点的配置元素。 对于链中的每个处理程序,添加一个
bean
元素,指定实施该处理程序的类。如果您的处理器实施在多个位置中使用,您可以使用
ref
元素引用bean
元素。
handlers 元素
jaxws:handlers
元素在端点配置中定义处理程序链。它可以显示为所有 JAX-WS 端点配置元素的子项。以下是:
-
jaxws:endpoint
配置一个服务提供程序。 -
jaxws:server
还配置服务提供商。 -
jaxws:client
配置服务使用者。
您可以通过以下两种方式之一将处理程序添加到处理程序链中:
-
添加定义实施类的
bean
元素 -
使用
ref
元素引用配置文件中其他位置的 namedbean
元素
在配置中定义处理程序的顺序是它们的执行顺序。如果您混合了逻辑处理程序和协议处理程序,则可以修改顺序。运行时间会将它们排序为正确的顺序,同时保持配置中指定的基本顺序。
示例
例 43.17 “配置端点以在 Spring 中使用处理程序链” 显示加载处理程序链的服务提供商的配置。
例 43.17. 配置端点以在 Spring 中使用处理程序链
<beans ... xmlns:jaxws="http://cxf.apache.org/jaxws" ... schemaLocation="... http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd ..."> <jaxws:endpoint id="HandlerExample" implementor="org.apache.cxf.example.DemoImpl" address="http://localhost:8080/demo"> <jaxws:handlers> <bean class="demo.handlers.common.LoggingHandler" /> <bean class="demo.handlers.common.AddHeaderHandler" /> </jaxws:handlers> </jaws:endpoint> </beans>