2.12.3. RESTEasy Interceptors
2.12.3.1. 拦截 JAX-RS 调用
RESTEasy 可以拦截 JAX-RS 调用,并通过称为拦截器的类似于侦听器的对象进行路由。
虽然过滤器修改请求或响应标头,而拦截器会处理消息正文。拦截器在与其对应的读取器或写入器相同的调用堆栈中执行。ReaderInterceptors
围绕执行 MessageBodyReaders
打包.WriterInterceptors
围绕执行 MessageBodyWriters
打包。它们可用于实施特定的内容编码。它们可用于生成数字签名,或者在托管之前或之后发布或预处理 Java 对象模型。
ReaderInterceptors
和 WriterInterceptors
可用于服务器或客户端。它们标有 @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()
方法 。
此打包允许在对象到达 Reader
或 Writer
之前修改对象,然后在 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()"); } }