第 56 章 Interceptor API
摘要
拦截器实施 PhaseInterceptor 接口,它扩展了基本拦截器接口。此接口定义了很多 Apache CXF 的运行时用于控制拦截器执行的方法,并不适用于开发人员实现。为简化拦截器开发,Apache CXF 提供了多个可以扩展的抽象拦截器实现。
接口
Apache CXF 中的所有拦截器都实现 例 56.1 “基本拦截器接口” 中显示的基本 Interceptor 接口。
例 56.1. 基本拦截器接口
package org.apache.cxf.interceptor; public interface Interceptor<T extends Message> { void handleMessage(T message) throws Fault; void handleFault(T message); }
Interceptor 接口定义了开发人员为自定义拦截器实施所需的两种方法:
- handleMessage()
-
handleMessage()
方法在拦截器中执行大多数工作。它在消息链中的每个拦截器调用,并接收正在处理的消息的内容。开发人员在此方法中实施拦截器的消息处理逻辑。有关实现handleMessage()
方法的详细信息,请参阅 第 58.2 节 “处理消息”。 - handleFault()
-
当普通消息处理被中断时,在拦截器中调用
handleFault()
方法。运行时调用每个调用拦截器的handleFault()
方法,因为它会取消截取拦截器链。有关实现handleFault()
方法的详细信息,请参阅 第 58.3 节 “出错后 Unwinding”。
大多数拦截器不会直接实施 Interceptor 接口。相反,它们实施 例 56.2 “阶段拦截器接口” 中显示的 PhaseInterceptor 接口。PhaseInterceptor 接口添加了四个方法来允许拦截器链。
例 56.2. 阶段拦截器接口
package org.apache.cxf.phase; ... public interface PhaseInterceptor<T extends Message> extends Interceptor<T> { Set<String> getAfter(); Set<String> getBefore(); String getId(); String getPhase(); }
摘要拦截器类
开发人员不应直接扩展 PhaseInterceptor 接口,而是扩展 AbstractPhaseInterceptor
类。此抽象类为 PhaseInterceptor 接口的阶段管理方法提供实施。AbstractPhaseInterceptor
类还提供了 handleFault()
方法的默认实施。
开发人员需要提供 handleMessage()
方法的实施。它们也可以为 handleFault()
方法提供不同的实现。开发人员提供的实施可以使用通用 org.apache.cxf.message.Message.Message 接口提供的方法操控消息数据。
对于使用 SOAP 消息的应用程序,Apache CXF 提供了一个 AbstractSoapInterceptor
类。扩展这个类提供 handleMessage()
方法和 handleFault()
方法,具有将消息数据的访问权限为 org.apache.cxf.binding. SOAp.SoapMessage
对象。SoapMessage
对象具有从消息中检索 SOAP 标头、SOAP envelope 和其他 SOAP 元数据的方法。