Where do @Context objects come from
glassfish, java, jax-rs, jersey
Solution
You can write your own injection provider and plug that into Jersey - look at SingletonTypeInjectableProvider and PerRequestTypeInjectableProvider - extend one of these classes (depending on the lifecycle you want for the injectable object) and register your implementation as a provider in your web app.
For example, something like this:
@Provider
public class MyObjectProvider extends SingletonTypeInjectableProvider<Context, MyObject> {
public MyObjectProvider() {
// binds MyObject.class to a single MyObject instance
// i.e. the instance of MyObject created bellow will be injected if you use
// @Context MyObject myObject
super(MyObject.class, new MyObject());
}
}
To include the provider in your web app you have several options:
- if your app uses classpath scanning (or package scanning) just make sure the provider is in the right package / on the classpath
- or you can simply register it using META-INF/services entry (add META-INF/services/com.sun.jersey.spi.inject.InjectableProvider file having the name of your provider class in it's contents)
Problem
I've been searching everywhere, but can't seem to find a clear answer... What is the mechanism whereby a server (glassfish for my problem) injects actual objets that are annotated with @Context? More specifically, if I wanted to write a class that did something like: ``` @Path("/") public class MyResource { @GET public String doSomething(@Context MyObject obj) { // ... } } ``` then how would I do it? Where is it that the MyObject is instanciated, who does it, and how? Edit: I've seen stuff like the following: Using @Context, @Provider and ContextResolver in JAX-RS http://jersey.576304.n2.nabble.com/ContextResolver-confusion-td5654154.html However, this doesn't square with what I've seen, e.g. in the constructor of org.neo4j.server.rest.web.RestfulGraphDatabase, which has the following signature: ``` public RestfulGraphDatabase( @Context UriInfo uriInfo, @Context Database database, @Context InputFormat input, @Context OutputFormat output, @Context LeaseManager leaseManager ) ```