59.3. 以编程方式添加拦截器
59.3.1. 添加拦截器的方法
可以使用以下任一方法之一,以编程方式将拦截器附加到端点:
- InterceptorProvider API
- Java 注解
使用 InterceptorProvider API 可让开发人员将拦截器附加到具有拦截器链的任何运行时组件,但它需要使用底层 Apache CXF 类。Java 注释只能添加到服务接口或服务实施中,但开发人员可以在 JAX-WS API 或 JAX-RS API 中保留。
59.3.2. 使用拦截器供应商 API
概述
拦截器可以使用实现 InterceptorProvider 接口的任何组件注册,这些组件在 拦截器供应商接口 中显示。
拦截器供应商接口
package org.apache.cxf.interceptor;
import java.util.List;
public interface InterceptorProvider
{
List<Interceptor<? extends Message>> getInInterceptors();
List<Interceptor<? extends Message>> getOutInterceptors();
List<Interceptor<? extends Message>> getInFaultInterceptors();
List<Interceptor<? extends Message>> getOutFaultInterceptors();
}
接口中的四个方法允许您检索每个端点的拦截器链作为 Java List 对象。开发人员可使用 Java List 对象提供的方法,向任何链添加或删除拦截器。
步骤
要使用 InterceptorProvider API 将拦截器附加到运行时组件的拦截器链,您必须:
使用将拦截器附加到的链访问运行时组件。
开发人员必须使用 Apache CXF 特定的 API 从标准 Java 应用程序代码访问运行时组件。运行时组件通常通过将 JAX-WS 或 JAX-RS 工件转换为底层 Apache CXF 对象来访问。
- 创建拦截器的实例。
- 使用正确的 get 方法来检索所需的拦截器链。
使用
List对象的add ()方法将拦截器附加到拦截器链。此步骤通常与检索拦截器链结合使用。
将拦截器附加到消费者
以编程方式将拦截器附加到消费者 显示将拦截器附加到 JAX-WS 消费者的入站拦截器链的代码。
以编程方式将拦截器附加到消费者
package com.fusesource.demo;
import java.io.File;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import org.apache.cxf.endpoint.Client;
public class Client
{
public static void main(String args[])
{
QName serviceName = new QName("http://demo.eric.org", "stockQuoteReporter");
Service s = Service.create(serviceName);
QName portName = new QName("http://demo.eric.org", "stockQuoteReporterPort");
s.addPort(portName, "http://schemas.xmlsoap.org/soap/", "http://localhost:9000/EricStockQuote");
quoteReporter proxy = s.getPort(portName, quoteReporter.class);
Client cxfClient = (Client) proxy;
ValidateInterceptor validInterceptor = new ValidateInterceptor();
cxfClient.getInInterceptor().add(validInterceptor);
...
}
}
以编程方式将拦截器附加到消费者 中的代码执行以下操作:
为消费者创建 JAX-WS Service 对象。
在提供消费者目标地址的 Service 对象中添加一个端口。
创建用于在服务提供商上调用方法的代理。
将代理发送到 org.apache.cxf.endpoint.Client 类型。
创建拦截器的实例。
将拦截器附加到入站拦截器链。
将拦截器附加到服务提供商
以编程方式将拦截器附加到服务提供商 显示将拦截器附加到服务提供商的出站拦截器链的代码。
以编程方式将拦截器附加到服务提供商
package com.fusesource.demo;
import java.util.*;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.frontend.ServerFactoryBean;
import org.apache.cxf.frontend.EndpointImpl;
public class stockQuoteReporter implements quoteReporter
{
...
public stockQuoteReporter()
{
ServerFactoryBean sfb = new ServerFactoryBean();
Server server = sfb.create();
EndpointImpl endpt = server.getEndpoint();
AuthTokenInterceptor authInterceptor = new AuthTokenInterceptor();
endpt.getOutInterceptor().add(authInterceptor);
}
}
以编程方式将拦截器附加到服务提供商 中的代码执行以下操作:
创建一个 ServerFactoryBean 对象,它提供对底层 Apache CXF 对象的访问。
获取 Apache CXF 用于代表端点的 Server 对象。
获取服务提供商的 Apache CXF EndpointImpl 对象。
创建拦截器的实例。
将拦截器附加到端点;s outbound interceptor 链。
将拦截器附加到总线
将拦截器附加到总线 显示将拦截器附加到总线入站拦截器链的代码。
将拦截器附加到总线
import org.apache.cxf.BusFactory; org.apache.cxf.Bus; ... Bus bus = BusFactory.getDefaultBus(); WatchInterceptor watchInterceptor = new WatchInterceptor(); bus..getInInterceptor().add(watchInterceptor); ...
将拦截器附加到总线 中的代码执行以下操作:
获取运行时实例的默认总线。
创建拦截器的实例。
将拦截器附加到入站拦截器链。
WatchInterceptor 将附加到运行时实例创建的所有端点的入站拦截器链。
59.3.3. 使用 Java 注解
概述
Apache CXF 提供四个 Java 注解,供开发人员指定端点使用的拦截器链。与将拦截器附加到端点的其它方法不同,注解会附加到应用程序级别的工件中。使用的工件决定了注解的影响范围。
放置注解的位置
注解可以放置在以下工件中:
定义端点端点的服务端点接口(SEI)
如果注解放置在 SEI 上,则实施接口的所有服务提供商以及所有使用 SEI 创建代理的用户都会受到影响。
服务实现类
如果注解放置在实施类上,则所有使用实现类的服务供应商都会受到影响。
注解
注解都包括在 org.apache.cxf.interceptor 软件包中,并在 表 59.2 “拦截器链注解” 中描述。
列出拦截器
拦截器列表以完全限定类名称列表的形式使用 在链注解中列出拦截器的语法 中显示的语法指定。
在链注解中列出拦截器的语法
interceptors={"interceptor1", "interceptor2", ..., "interceptorN"}
示例
将拦截器附加到服务实现 显示将两个拦截器附加到使用 SayHiImpl 提供逻辑的端点的入站拦截器链的注解。
将拦截器附加到服务实现
import org.apache.cxf.interceptor.InInterceptors;
@InInterceptors(interceptors={"com.sayhi.interceptors.FirstLast", "com.sayhi.interceptors.LogName"})
public class SayHiImpl implements SayHi
{
...
}