57.2. 指定拦截器的阶段
概述
拦截器被组织成阶段。拦截器的阶段决定在消息处理序列中的何时被调用。开发人员指定拦截器的阶段。使用框架提供的常量值来指定阶段。
阶段
阶段是拦截器的逻辑集合。如 图 57.1 “拦截器阶段” 所示,阶段中的拦截器会按顺序调用。
图 57.1. 拦截器阶段
阶段以有序列表的形式链接,组成一个拦截器链,并在消息处理过程中提供定义的逻辑步骤。例如,入站拦截器的 RECEIVE 阶段中的一组拦截器使用从线路中提取的原始消息数据,处理传输级别详情。
但是,在任何阶段都无法执行什么操作。建议在阶段内拦截器遵循处于阶段激增的任务。
Apache CXF 定义的各个阶段的完整列表可在 第 62 章 Apache CXF 消息处理阶段 中找到。
指定阶段
Apache CXF 提供 org.apache.cxf.Phase
类,以用于指定阶段。类是一系列恒定的。Apache CXF 定义的每个阶段都具有 阶段
类中的相应常量。例如,RECEIVE 阶段通过 value Phase.RECEIVE 指定。
设置阶段
拦截器的阶段在拦截器的构造器中设置。AbstractPhaseInterceptor
类定义了三个构造器用于实例化拦截器:
public AbstractPhaseInterceptor (String phase)
- 将拦截器的阶段设置为指定阶段,并将拦截器的 id 设置为拦截器的类名称。这种构造器将满足大多数用例的需求。
-
public AbstractPhaseInterceptor (String id, String phase)
- 将拦截器的 id 设置为以第一个参数形式传递的字符串,以及拦截器的阶段到第二个字符串。 -
public AbstractPhaseInterceptor (String phase, boolean uniqueId)
- 指定拦截器是否应使用唯一、系统生成的 id。如果uniqueId
参数为true
,则拦截器的 id 将由系统计算。如果uniqueId
参数设为false
,则拦截器的 id 被设置为拦截器的类名称。
设置自定义拦截器阶段的建议方法是,使用 super ()
方法将阶段传递给 AbstractPhaseInterceptor
结构器,如 例 57.1 “设置拦截器的阶段” 所示。
例 57.1. 设置拦截器的阶段
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
public class StreamInterceptor extends AbstractPhaseInterceptor<Message>
{
public StreamInterceptor()
{
super(Phase.PRE_STREAM);
}
}
例 57.1 “设置拦截器的阶段” 中显示的 StreamInterceptor
拦截器被放入 PRE_STREAM 阶段。