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:
¿Hay algún código de muestra que demuestre cómo usar guice-servlet con Jersey 2.0?
Este es un PoC de trabajo mínimo que une a Jersey 2 y Guice juntos:
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.
Para aquellos interesados, hay una muestra de la integración guice / jersey disponible en https://github.com/mycom-int/jersey-guice-aop .
Sí, he adaptado un ejemplo y está disponible aquí: https://github.com/piersy/jersey2-guice-example-with-test
He actualizado el código de ejemplo ahora, tiene una prueba con jetty y otra con tomcat.
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);
}
}
}
https://github.com/Squarespace/jersey2-guice parece ser la primera integración genuina de Guice para Jersey 2 pero requiere la versión 2.11+.
NOTA : No he probado esto, pero la idea es buena.
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