Skip to content
This repository has been 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
mkarg opened this issue Mar 30, 2018 · 2 comments

Comments

@mkarg
Copy link

mkarg commented Mar 30, 2018

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
@mkarg
Copy link
Author

mkarg commented Mar 30, 2018

Please see this JAX-RS API issue for reference: jakartaee/rest#605.

@mkarg
Copy link
Author

mkarg commented Mar 30, 2018

FYI: Using jVisualVM I noticed that the three mentioned instances actually are kept in memory even after a GC got performed. This looks like a memory leak, as at least the Feature instance is of no use at runtime (the other two instances actually get used by every invocation).

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

2 participants