43.10. 配置端点以使用处理程序

43.10.1. 程序配置

43.10.1.1. 在消费者中添加处理程序链

概述

添加处理程序链到消费者涉及明确构建处理程序链。然后,您将直接在服务代理的 Binding 对象上设置处理器链。

重要

使用 Spring 配置配置的任何处理程序链会覆盖程序配置的处理程序链。

流程

将处理程序链添加到您执行以下操作的消费者中:

  1. 创建 List<Handler& gt; 对象以容纳处理程序链。
  2. 创建一个将添加到链中的每个处理程序的实例。
  3. 根据运行时调用的顺序,将每个实例化处理程序对象添加到列表中。
  4. 从服务代理获取 Binding 对象。

    Apache CXF 提供名为 org.apache.cxf.jaxws.binding.DefaultBindingImpl 的绑定接口实施。

  5. 使用 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 “在消费者中添加处理程序链” 中的代码执行以下操作:

实例化处理程序。

创建用于存放链的 List 对象。

添加处理程序到 链。

从代理获取 Binding 对象作为 DefaultBindingImpl 对象。

将处理程序链分配给代理的绑定。

43.10.1.2. 在服务提供商中添加处理程序链

概述

您可以通过对带有 @HandlerChain 注释的 SEI 或实施类来向服务提供商添加处理程序链。该注释指向定义服务提供商所使用的处理程序链的 meta-data 文件。

流程

要将处理程序链添加到您执行以下操作的服务供应商中:

  1. 使用 @HandlerChain 注释拒绝该供应商的实施类。
  2. 创建定义处理程序链的处理程序配置文件。
@HandlerChain 注释

javax.jws.HandlerChain 注解 decorates service provider 的实施类。它指示运行时加载由其 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 服务)。这个mar在 http://java.sun.com/xml/ns/javaee 中定义。

处理程序配置文件的根元素是 handler-chains 元素。handler-chains 元素具有一个或多个 handler-chain 元素。

handler-chain 元素定义处理程序链。表 43.1 “用于定义服务器范围处理程序链的元素” 描述 handler-chain 元素的子项。

表 43.1. 用于定义服务器范围处理程序链的元素

元素描述

处理程序

包含描述处理程序的元素。

service-name-pattern

指定 WSDL 服务 元素的 QName,用于定义处理程序链绑定到的服务。在定义 QName 时,您可以使用 * 作为通配符。

port-name-pattern

指定 WSDL 端口 元素的 QName,用于定义处理程序链的端点。在定义 QName 时,您可以使用 * 作为通配符。

协议绑定

指定使用处理程序链的消息绑定。绑定被指定为 URI 或使用以下别名之一 : #\#SOAP11_HTTP\##SOAP11_HTTP_MTOM\##SOAP12_HTTP\##SOAP12_HTTP_MTOM\#\#XML_HTTP

有关消息绑定 URI 的更多信息,请参阅 第 23 章 Apache CXF Binding ID

handler-chain 元素只需要将单一 handler 元素用作子项。不过,它可以根据需要支持许多 处理程序 元素来定义完整的处理程序链。链中的处理程序按照处理程序链定义中指定的顺序执行。

重要

最后执行顺序将由将指定的处理程序排序为逻辑处理程序和协议处理程序来确定。在分组中,将使用配置中指定的顺序。

其他子项(如 protocol-binding )用于限制定义的处理器链的范围。例如,如果您使用 service-name-pattern 元素,处理程序链将仅附加到服务提供程序,其 WSDL 端口 元素是指定 WSDL 服务 元素的子级。您只能在 handler 元素中使用其中一个限制的 children。

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 子级来完成。

重要

通过配置文件添加的处理程序链优先于程序配置的处理器链。

流程

要配置端点来加载处理器链,请执行以下操作:

  1. 如果端点还没有配置元素,请添加。

    有关配置 Apache CXF 端点的详情请参考 第 17 章 配置 JAX-WS 端点

  2. jaxws:handlers 子元素添加到端点的配置元素。
  3. 对于链中每一处理程序,添加一个 bean 元素,指定实施该处理程序的类。

    如果在多个位置中使用您的处理程序实施,您可以使用 ref 元素引用 bean 元素。

handlers 元素

jaxws:handlers 元素在端点配置中定义一个处理程序链。它可以作为所有 JAX-WS 端点配置元素的子项显示。这些是:

  • jaxws:endpoint 配置服务供应商。
  • jaxws:server 还配置服务提供商。
  • jaxws:client 配置服务消费者。

您可以通过以下两种方式之一向处理器链添加处理程序:

  • 添加定义实现类的 bean 元素
  • 使用 ref 元素引用来自配置文件其他位置的命名 bean 元素

在配置中定义处理程序的顺序就是执行它们的顺序。如果您混合了逻辑处理程序和协议处理程序,则顺序可以被修改。运行时间会将它们排序成正确的顺序,同时保持配置中指定的基本顺序。

示例

例 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>