mme
mme

Reputation: 11

Injecting objects into jersey ressources

Can't figure out how to make an object created at jersey-server start accessible in jersey resources. Basically, what i want to do is to inject a Database context into jersey resources.

JerseyServer:

public boolean startServer(String keyStoreServer, String trustStoreServer) {
    //Check if GraphDb is setup
    if (gdbLogic == null) {
        //FIXME - maybe throw an exception here?
        return false;
    }

    // create a resource config that scans for JAX-RS resources and providers
    // in org.developer_recommender.server package
    final org.glassfish.jersey.server.ResourceConfig rc = new org.glassfish.jersey.server.ResourceConfig().packages("org.developer_recommender.server").register(createMoxyJsonResolver());

    WebappContext context = new WebappContext("context");
    ServletRegistration registration = context.addServlet("ServletContainer", ServletContainer.class);
    //TODO: value setzen
    registration.setInitParameter("jersey.config.server.provider.packages", "org.developer_recommender.server.service;org.developer_recommender.server.auth");
    registration.setInitParameter(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS, SecurityFilter.class.getName());   
    SSLContextConfigurator sslContext = new SSLContextConfigurator();

    sslContext.setKeyStoreFile(keyStoreServer);
    sslContext.setTrustStoreFile(trustStoreServer);

    //TODO - 
    sslContext.setKeyStorePass("123456");
    sslContext.setTrustStorePass("123456");
    // create and start a new instance of grizzly http server
    // exposing the Jersey application at BASE_URI
    HttpServer server = null;
    try{
        SSLEngineConfigurator sslec = new SSLEngineConfigurator(sslContext).setClientMode(false).setNeedClientAuth(true);
        server = GrizzlyHttpServerFactory.createHttpServer(getBaseURI()/*URI.create(BASE_URI)*/, rc, true , sslec);
        System.out.println("Jersey app started. Try out " + BASE_URI);
        context.deploy(server);
        return true;
    } catch(Exception e ){
        System.out.println(e.getMessage());
    }

    return false;

Service:

public class Service {

    @Inject
    protected GDBLogic gbdLogic;

}

So i want the instance of GDBLogic in startServer to be accessible in Jersey Resources. Any advice on how to achieve this? I don't want to use a static field for GDBLogic to achieve this, cause we will have a minimum of two different Database configurations.

Upvotes: 1

Views: 1270

Answers (1)

Alden
Alden

Reputation: 6713

You need to set up the instance binding in order to get the injection to work. You can do that by adding an HK2 abstract binder to your resource config:

final ResourceConfig rc = new ResourceConfig()
    .packages("org.developer_recommender.server")
    .register(createMoxyJsonResolver())
    .register(new AbstractBinder() 
    {
        @Override
        protected void configure()
        {
            bind(gdbLogic).to(GDBLogic.class);
        }
    });

Upvotes: 1

Related Questions