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里面包含requestFilters
,responseFilters
,writerInterceptors
这些classes。
有不同的地方使用ResourceMethodInvoker
,比如ServerResponseWriter
会使用writerInterceptors
。下面是ServerResponseWriter
的class diagram:
SynchronousDispatcher
会使用ServerResponseWriter
进行response的输出:
实际调用的是ServerResponseWriter
的writeNomapResponse(...)
方法,而这个方法里和interceptor相关的代码如下:
注意上面对MessageBodyWriter
和writerInterceptors
的使用。
Interceptor
,MessageBodyWriter
,MessageBodyReader
这些是服务端与客户端通用的。
下面是MessageBodyWriter
的引用情况:
下面是MessageBodyReader
的引用情况:
以下是interceptor registry的使用情况:
打开ClientConfiguration
的源代码,可以看到相关的interceptors的获取情况:
可以看到是调用ResteasyProviderFactory
的ClientWriterInterceptor
的postMatch(...)
方法,获得的WriterInterceptor[]
,然后reader这边也是一样。
上面的ReaderInterceptorRegistry
和WriterInterceptorRegistry
是定义在resteasy-jaxrs
当中的。它们都是扩展JaxrsInterceptorRegistry<T>
的模版类。下面是相关类图:
由上面的分析可以看到interceptors和message body readers/writers是服务端和客户端通用的。
- 上一篇 解决Git项目里面冲突的过程记录
- 下一篇 Git的日常rebase流程