Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to wire in a collaborator into a Jersey resource?

Tags:

java

jersey

I have a method to start up my application:

public void start() throws IOException {
    final Map<String, String> initParams = new HashMap<String, String>();
    initParams.put("com.sun.jersey.config.property.packages", "com.example");
    threadSelector = GrizzlyWebContainerFactory.create(baseUri, initParams);
}

And I have a Jersey resource class:

@Path("/notification")
public class NotificationResource {
    // HOW DO I INJECT THIS GUY?
    private MySampleCollabolator  mySampleCollabolator;    

    @POST
    public void create() {
        System.out.println("Hello world"); 
    }
}

What is the proper way of handling dependencies? I would like my resources to communicate with other objects, how do I wire them together?

like image 648
Wojtek B. Avatar asked Aug 19 '11 12:08

Wojtek B.


2 Answers

You can implement InjectableProvider. For example:

@Provider
public class FooProvider
    implements InjectableProvider<Resource, Type> {

    public ComponentScope getScope() {
        return ComponentScope.PerRequest;
    }

    public Injectable getInjectable(ComponentContext ic, Resource resource, Type type) {
        return new Injectable() {
            public Object getValue() {
                return new Foo();
            }
        };
    }
}

and then annotate field in your resource:

@Resource private Foo foo;

like image 134
ivan.cikic Avatar answered Nov 02 '22 06:11

ivan.cikic


If you're comfortable using spring, then the best way is to use the jersey spring api module (installed as an additional dependency). It's released in lockstep with Jersey.

The javadoc page has a decent example to get you started.

like image 1
Sean Reilly Avatar answered Nov 02 '22 08:11

Sean Reilly