2013-08-06 9 views
6

Voglio usare Guice + Jersey 2.0 su Grizzly. Secondo questa discussione How to use guice-servlet with Jersey 2.0? non esiste attualmente l'integrazione diretta di Guice per Jersey2, ma può essere ottenuta utilizzando HK2 come bridge. Ho anche controllato il progetto di esempio in Github https://github.com/piersy/jersey2-guice-example-with-test. Questo progetto è implementato usando Jetty.Come utilizzare il guice jersey 2.0 su grizzly

Ma il mio problema è implementarlo in Grizzly. Su Jetty viene utilizzato in questo modo

@Inject 
public MyApplication(ServiceLocator serviceLocator) { 
    // Set package to look for resources in 
    packages("example.jersey"); 

    System.out.println("Registering injectables..."); 

    GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator); 

    GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class); 
    guiceBridge.bridgeGuiceInjector(Main.injector); 

} 

Il mio problema su Grizzly è, come ottenere questo oggetto ServiceLocator?

Grazie.

risposta

5

ho creato il campione qui https://github.com/oleksiys/samples/tree/master/jersey2-guice-example-with-test

Il codice di inizializzazione Grizzly è simile al seguente:

final URI uri = UriBuilder.fromUri("http://127.0.0.1/") 
     .port(8080).build(); 

// Create HttpServer 
final HttpServer serverLocal = GrizzlyHttpServerFactory.createHttpServer(uri, false); 

// Create Web application context 
final WebappContext context = new WebappContext("Guice Webapp sample", ""); 

context.addListener(example.jersey.Main.class); 

// Initialize and register Jersey ServletContainer 
final ServletRegistration servletRegistration = 
     context.addServlet("ServletContainer", ServletContainer.class); 
servletRegistration.addMapping("/*"); 
servletRegistration.setInitParameter("javax.ws.rs.Application", 
     "example.jersey.MyApplication"); 

// Initialize and register GuiceFilter 
final FilterRegistration registration = 
     context.addFilter("GuiceFilter", GuiceFilter.class); 
registration.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), "/*"); 

context.deploy(serverLocal); 

serverLocal.start(); 
+0

dovuto aggiungere 'System.in.read()'. Grazie –

+0

Questo esempio funziona perfettamente, ma come registrare un ContainerResponseFilter? – javapenguin

1

aggiungere dependecy

compile group: "org.glassfish.hk2", name: "guice-bridge", version: "2.4.0" 

creare funzione

public class GuiceFeature implements Feature { 

    @Override 
    public boolean configure(FeatureContext context) { 
     ServiceLocator serviceLocator = ServiceLocatorProvider.getServiceLocator(context); 

     GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator); 
     GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class); 

     Injector injector = Guice.createInjector(new AbstractModule() { 
      @Override 
      protected void configure() { 
       bind(YYY.class).to(ZZZ.class); 
      } 
     }); 
     guiceBridge.bridgeGuiceInjector(injector); 

     return true; 
    } 
} 

caratteristica registro

ResourceConfig resourceConfig = new ResourceConfig(); 
resourceConfig.register(GuiceFeature.class);