Dynamic Provider Registration in JAX-RS
Wondering if it's possible to register providers dynamically in JEE? The answer is yes, it is possible! Read on to find out how it's done.
The DynamicFeature class in JAX-RS (2.0) allows you to register providers:
- Dynamically i.e. without any pre-defined binding strategy (e.g. annotations).
- Based on criteria i.e. to help decide which provider to bind to which JAX-RS resource(s).
The JAX-RS implementation detects and executes the DynamicFeature implementations at deployment time
Here is an example where we instruct the JAX-RS runtime to dynamically bind the AuthenticationFilter (a JAX-RS post construct filter) to be applied when a PUT is invoked on UserResource (which is a JAX-RS resource class):
@Provider
public class DynamicFilter implements DynamicFeature {
@Override
public void configure(ResourceInfo resInfo, FeatureContext ctx) {
if (UserResource.class.equals(resInfo.getResourceClass()) &&
resInfo.getResourceMethod().getName().contains("PUT")) {
ctx.register(AuthenticationFilter.class);
}
}
}
Criteria-Based
Criteria are provided by ResourceInfo, and they're based on two attributes:
- The resource class
- The resource method
Dynamic
Dynamic registration is achieved using FeatureContext, whose register method can be used to bind the provider.
Note
@Provideris needed for automatic discovery by the JAX-RS runtime.- Applicable for: filters, interceptors and any
Feature - In case of filters, the following applicability criteria apply
- Post matching (
@PreMatchingfilters excluded). - Server side filters i.e.
ClientRequestFilterandClientResponseFiltercannot be registered using this method.
- Post matching (
- Once used, it overrides other bindings (static or using
@NameBinding).
Published at DZone with permission of Abhishek Gupta. See the original article here.
Opinions expressed by DZone contributors are their own.