RESTEasy的Interceptors和MessageBodyReader/Writer设计

和filters不同,JAX-RS标准下的intercetors和message body reader/writer是服务端和客户端通用的设计。本文分析RESTEasy里面的相关实现。

以下是JaxrsInterceptorRegistry的classes设计:

下面是完整的设计图:

下面是分解出来的,各种context classes:

ReaderInterceptorContext如下所示:

这里面,MessageBodyReader是用来intercept那个javax.ws.rs.ext.MessageBodyReader#readFrom的。

ResourceMethodInvoker的设计如下:

可以看到这个class里面包含requestFiltersresponseFilterswriterInterceptors这些classes。

有不同的地方使用ResourceMethodInvoker,比如ServerResponseWriter会使用writerInterceptors。下面是ServerResponseWriter的class diagram:

SynchronousDispatcher会使用ServerResponseWriter进行response的输出:

实际调用的是ServerResponseWriterwriteNomapResponse(...)方法,而这个方法里和interceptor相关的代码如下:

注意上面对MessageBodyWriterwriterInterceptors的使用。

InterceptorMessageBodyWriterMessageBodyReader这些是服务端与客户端通用的。

下面是MessageBodyWriter的引用情况:

下面是MessageBodyReader的引用情况:

以下是interceptor registry的使用情况:

打开ClientConfiguration的源代码,可以看到相关的interceptors的获取情况:

可以看到是调用ResteasyProviderFactoryClientWriterInterceptorpostMatch(...)方法,获得的WriterInterceptor[],然后reader这边也是一样。

上面的ReaderInterceptorRegistryWriterInterceptorRegistry是定义在resteasy-jaxrs当中的。它们都是扩展JaxrsInterceptorRegistry<T>的模版类。下面是相关类图:

由上面的分析可以看到interceptors和message body readers/writers是服务端和客户端通用的。