Version 2

    RESTEasy Interceptors (Proposed Feature)

    A number of new ideas have cropped up on the RESTEasy developers list that indicate that adding some type of request/response interceptor API to RESTEasy could aid in adding these features. Such features include:


    1. RESTEasy Server-Side Caching API Ideas
    2. Content Negotiation customization
    3. GZip Input/Output streams
    4. Security


    There could more, but you get the point. Below are a few approaches we could take.

    Filter-Style Interceptor

    This type of interceptor looks similar to a Servelt Filter and provides access to the raw request and response. more details TDB.


    Annotation-based Interceptor

    The annotation approach allows the developer to define specific points in the request/response lifecycle where we can alter the process. There are a few directions we could take this such as having really broad point cuts like @BeforeRequest and @AfterRequest. Or, we could have more fine grained pointcuts such as:


    • @BeforeResresource: executes after the request has been processed, but before the resource method has been invoked
    • @AfterResource: executes after the resource method has been executed, but before the MessageBodyWriter is invoked
    • @BeforeWriter: after the request has been provecces and the resource method has been executed, but before the invocation of the MessgaeBodyWriter
    • @AfterWriter: executed after the message body reader
    • @BeforeReader: executed before the MessageBodyReader is executed
    • @AfterReader: executed after the MessageBodyReade, but before the resource method
    • Perhaps more? (some of these maybe redundant, but we'll work that out)


    An interceptor might end up looking something like this:





    public class CacheControlInterceptor



       public Response checkCache(@Context HttpRequest request,

                  @Context HttpResponse response,

                  @Context RequestContext ctx)


          ...check the cache...



       public void addCacheControlHeaders(@Context HttpResponse response

                                          @Context RequestContext ctx)


          ... write some cache control headers...



       public void grabBytesToMarshall(@Context HttpResponse response

                                       @Context RequestContext) {





    Unresolved Issues

    One thing that still needs to get worked out if how to declare precedence of interceptors, what gets executed first, etc.