This repository was archived by the owner on May 28, 2018. It is now read-only.
This repository was archived by the owner on May 28, 2018. It is now read-only.
Jersey creates multiple provider instances if a class implements more than one provider interface #3796
Open
Description
JAX-RS Specification 2.1 Chapter 4.1 Line 1: "By default a single instance of each provider class is instantiated for each JAX-RS application."
Jersey clearly violates this rule as it creates one instance of such a class per provider interface this class implements. For example, in case a class is annotated with @Provider
and implements both ContainerRequestFilter
and ContainerResponseFilter
then Jersey creates two instances, instead one instance. In case this class additionally implements Feature
then Jersey even creates a third instance.
Can be reproduce using the following code:
@Provider
public class MyProvider implements Feature, ContainerRequestFilter, ContainerResponseFilter {
@Override
public boolean configure(FeatureContext context) {
System.out.println("Feature.this = " + this);
return true;
}
@Override
public void filter(ContainerRequestContext requestContext) {
System.out.println("ContainerRequestFilter.this = " + this);
}
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) {
System.out.println("ContainerResponseFilter.this = " + this);
}
}
Here is the result it prints after the first invocation finished:
Feature.this = eu.headcrashing.bugs.MyProvider@6cee903a
...
ContainerRequestFilter.this = eu.headcrashing.bugs.MyProvider@575a86ae
ContainerResponseFilter.this = eu.headcrashing.bugs.MyProvider@69767b65
To be compliant to the mentioned chapter of the spec, the result MUST be this instead:
Feature.this = eu.headcrashing.bugs.MyProvider@6cee903a
...
ContainerRequestFilter.this = eu.headcrashing.bugs.MyProvider@6cee903a
ContainerResponseFilter.this = eu.headcrashing.bugs.MyProvider@6cee903a