jax-rs Apache CXF,在拦截器之间传输数据

Ily*_*lya 2 java rest cxf interceptor

我们有两个拦截器.输入拦截器Phase.RECEIVE和输出拦截器Phase.SETUP_ENDING

public class BeforeInterceptor extends AbstractPhaseInterceptor<Message> 
{
   public BeforeInterceptor()
   {
      super(Phase.RECEIVE);
   }  
Run Code Online (Sandbox Code Playgroud)

和

public class AfterInterceptor extends AbstractPhaseInterceptor<Message> 
{
   public AfterInterceptor()
   {
      super(Phase.SETUP_ENDING);
   }  
Run Code Online (Sandbox Code Playgroud)

现在我想知道:这两个阶段之间有多少时间?
我必须调用System.currentTimeMillis();BeforeInterceptor,将此值转换为AfterInterceptor,并
System.currentTimeMillis() - valueFromBeforeInterceptor在拦截器后调用.

但是如何从另一个拦截器传输数据呢?

Ian*_*rts 5

要在同一链中的两个拦截器之间传递数据(即两个"in"拦截器或两个"out"拦截器),您可以在 Message

// BeforeInterceptor
message.put("com.example.MyApp.startTime", System.currentTimeMillis());

// AfterInterceptor
long totalTime = System.currentTimeMillis() -
   (Long)message.get("com.example.MyApp.startTime");
Run Code Online (Sandbox Code Playgroud)

如果一个拦截器位于"in"链中而另一个位于"out"链中,那么您可以将其Exchange用于同一目的:

// BeforeInterceptor
inMessage.getExchange().put("com.example.MyApp.startTime", System.currentTimeMillis());

// AfterInterceptor
long totalTime = System.currentTimeMillis() -
   (Long)outMessage.getExchange().get("com.example.MyApp.startTime");
Run Code Online (Sandbox Code Playgroud)

无论您使用哪一个,最好选择您确定不会与任何其他拦截器冲突的密钥,例如使用Java包式分层名称.