2.12.3. RESTEasy Interceptors

2.12.3.1. 拦截 JAX-RS 调用

RESTEasy 可以拦截 JAX-RS 调用,并通过称为拦截器的类似于侦听器的对象进行路由。

虽然过滤器修改请求或响应标头,而拦截器会处理消息正文。拦截器在与其对应的读取器或写入器相同的调用堆栈中执行。ReaderInterceptors 围绕执行 MessageBodyReaders 打包.WriterInterceptors 围绕执行 MessageBodyWriters 打包。它们可用于实施特定的内容编码。它们可用于生成数字签名,或者在托管之前或之后发布或预处理 Java 对象模型。

ReaderInterceptorsWriterInterceptors 可用于服务器或客户端。它们标有 @Provider,以及 @ServerInterceptor@ClientInterceptor,以便 RESTEasy 知道是否将它们添加到拦截器列表中。

这些拦截器围绕调用 MessageBodyReader.readFrom()或 MessageBodyWriter.writeTo()进行 打包。它们可用于嵌套 输出输入 流。

示例:Interceptor

@Provider
public class BookReaderInterceptor implements ReaderInterceptor {
    @Inject private Logger log;
    @Override
    @ReaderInterceptorBinding
    public Object aroundReadFrom(ReaderInterceptorContext context) throws IOException, WebApplicationException {
        log.info("*** Intercepting call in BookReaderInterceptor.aroundReadFrom()");
        VisitList.add(this);
        Object result = context.proceed();
        log.info("*** Back from intercepting call in BookReaderInterceptor.aroundReadFrom()"); return result;
    }
}

拦截器和 MessageBodyReader 或 Writer 在一个大型 Java 调用堆栈中调用。ReaderInterceptorContext.proceed()WriterInterceptorContext.proceed() 被调用来进入下一个拦截器;如果没有要调用的拦截器,则调用拦截 器( ) 或 writeTo() 方法 此打包允许在对象到达 ReaderWriter 之前修改对象,然后在 continue () 返回后进行清理。

以下示例是服务器端拦截器,它为响应添加一个标头值。

@Provider
public class BookWriterInterceptor implements WriterInterceptor {
   @Inject private Logger log;

   @Override
   @WriterInterceptorBinding
   public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
      log.info("*** Intercepting call in BookWriterInterceptor.aroundWriteTo()");
      VisitList.add(this);
      context.proceed();
      log.info("*** Back from intercepting call in BookWriterInterceptor.aroundWriteTo()");
   }
}