This is a quick post which points out how to share contextual user-defined (custom) data between JAX-RS filters.
- It is chain based: one filter gets executed after another
- Request filters are executed before Response filters
- If a filter throws an exception, the chain breaks and other filters are skipped i.e. an exception from a Request filter will auto-abort all other Request filters. The same is applicable to Response filters.
For more info, please do check out one of my existing blog posts which discussed JAX-RS server side processing pipeline in depth
Sharing data b/w filters
JAX-RS API enables sharing of user-defined data amongst filters associated with a particular request
- It is abstracted in the form of a Map<String,Object> (pretty natural choice) via the ContainerRequestContext interface
- Get all the custom properties using the getPropertyNames() method
- The value of a specific property can be fetched (from the Map) using getProperty(String name)
- Overwrite an existing property or a add a new one using setProperty(String name, Object val).
Here is how multiple Request filters can share user-defined contextual data amongst themselves:
Another example where a Response filter uses the contextual data set by a Request filter:
To be noted…
The same capability is available in the Client side JAX-RS filters as well. The only difference is that you would be interacting with an instance of the ClientRequestContext
- For more discussion on Filters and other JAX-RS 2.0 stuff you can take a look at this article in the latest edition of Java Magazine.
- I have discussed different binding strategies for JAX-RS filters in a previous post.
- Check out the official JAX-RS 2.0 specification doc.