1

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.

harschware
  • 13,006
  • 17
  • 55
  • 87
mme
  • 11
  • 2
  • possible duplicate : http://stackoverflow.com/questions/7985231/injecting-into-a-jersey-resource-class – Asraful Mar 22 '14 at 15:57

1 Answers1

1

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);
        }
    });
Alden
  • 6,553
  • 2
  • 36
  • 50