guice-servlet jersey-2.0

guice servlet - ¿Cómo usar guice-servlet con jersey 2.0?



jersey-2.0 (8)

Aquí hay un ejemplo utilizando Embedded Jetty (probablemente también debería funcionar para el servidor Jetty)

jetty-jersey-HK2-Guice-boilerplate

Si planea utilizar Guice para su aplicación, todos los componentes de Guice inyectados en Jersey deben declararse como un enlace en la configuración de Guice.

Si no desea declarar todos los enlaces en la configuración de Guice, aquí hay un adaptador:

guice-bridge-jit-injector

¿Hay algún código de muestra que demuestre cómo usar guice-servlet con Jersey 2.0?



Hay una página en HK2 oficial sobre la correcta implementación de la guía: https://javaee.github.io/hk2/guice-bridge.html

Deberías crear tu Inyector algo como esto:

public class GuiceConfig extends ResourceConfig { @Inject public GuiceConfig(ServiceLocator serviceLocator) { this(); GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator); GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class); guiceBridge.bridgeGuiceInjector(GuiceListener.createBiDirectionalGuiceBridge(serviceLocator)); } public GuiceConfig() { packages(Injections.packages); addProperties(Injections.propertiesMap); } }

Y el código del documento debería actualizarse como:

@WebListener public class GuiceListener extends GuiceServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { Locale.setDefault(Locale.ENGLISH); super.contextInitialized(servletContextEvent); } public static volatile Injector injector = null; @Override protected Injector getInjector() { return injector; } @SuppressWarnings("unchecked") private static Module getModule() { return binder -> { Injections.singletonInterfaces.forEach((i, c) -> binder.bind(i).to(c).in(Scopes.SINGLETON)); Injections.singletonClasses.forEach(c -> binder.bind(c).in(Scopes.SINGLETON)); }; } static synchronized Injector createBiDirectionalGuiceBridge(ServiceLocator serviceLocator) { return GuiceListener.injector = createBiDirectionalGuiceBridge(serviceLocator, getModule()); } }

Usando la dependencia de maven en tu pom.xml

<dependency> <groupId>org.glassfish.hk2</groupId> <artifactId>guice-bridge</artifactId> <version>2.3.0</version> </dependency>

https://github.com/phxql/jersey2-guice no funciona con jersey 2.22 y guice 4.0.




Ya lo he hecho en esta muestra:

https://github.com/jbescos/tododev

Tienes que registrar la clase https://github.com/jbescos/tododev/blob/master/jersey2-guice/src/main/java/es/tododev/rest/ApplyGuiceContextFilter.java en tu ResourceConfig, y el inyector de la acusación encuadernado en un abstractmodule.

@Provider @PreMatching public class ApplyGuiceContextFilter implements ContainerRequestFilter, ContainerResponseFilter { @Inject public ApplyGuiceContextFilter(ServiceLocator serviceLocator, Injector injector) { GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator); GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class); guiceBridge.bridgeGuiceInjector(injector); } @Override public void filter(final ContainerRequestContext requestContext) throws IOException { } @Override public void filter(final ContainerRequestContext requestContext, final ContainerResponseContext responseContext) throws IOException {} }

Este es el ResouceConfig :

public class RestConfig extends ResourceConfig { @Inject public RestConfig() { this(Guice.createInjector(new Module(){ @Override public void configure(Binder arg0) { // TODO Auto-generated method stub } })); } // Test public RestConfig(Injector injector) { packages(ResourceSample.class.getPackage().getName()); register(ApplyGuiceContextFilter.class); register(new LoggingFilter(Logger.getLogger(LoggingFilter.class.getName()), true)); property(ServerProperties.TRACING, "ALL"); register(new RestBinder(injector)); } private static class RestBinder extends AbstractBinder{ private final Injector injector; private RestBinder(Injector injector){ this.injector = injector; } @Override protected void configure() { bind(injector).to(Injector.class); } } }



GWizard incluye un módulo que le brinda integración inmediata entre Jersey2 y Guice. Aquí hay un ejemplo de un servicio completo JAX-RS:

public class Main { @Path("/hello") public static class HelloResource { @GET public String hello() { return "hello, world"; } } public static class MyModule extends AbstractModule { @Override protected void configure() { bind(HelloResource.class); } } public static void main(String[] args) throws Exception { Guice.createInjector(new MyModule(), new JerseyModule()).getInstance(WebServer.class).startJoin(); } }

Tenga en cuenta que esto se basa en el https://github.com/Squarespace/jersey2-guice , que puede no funcionar correctamente con futuras versiones de puntos de Jersey. GWizard también ofrece un módulo RESTEasy JAX-RS, que es el preferido.

Aquí hay una entrada de blog sobre esto que podría ayudar: http://blorn.com/post/107397841765/guice-and-jersey-2-the-easy-way