usar paso para inyección inyeccion how dependencias con component como java dependency-injection jersey dagger-2 jsr330

java - paso - inyeccion de dependencias



¿Cómo hacer que Jersey funcione con la inyección de dependencia Dagger? (1)

Jersey normalmente usa la inyección de dependencia HK2, pero me gustaría usar Jersey con Dagger 2. Tanto Dagger como HK2 implementan JSR 330, que he tomado como evidencia de que esto debería ser posible sin demasiado esfuerzo. Encontré maneras de hacer que Jersey funcione con CDI (por ejemplo, Weld), Spring DI y Guice, pero no puedo encontrar nada en Dagger.

Para proporcionar algo de contexto: estoy ejecutando un servidor Grizzly-Jersey en un entorno SE, no en un contenedor de EE. Mi proyecto Maven tiene com.google.dagger:dagger y org.glassfish.jersey.containers:jersey-container-grizzly2-http como dependencias, pero no org.glassfish.jersey.inject:jersey-hk2 , ya que quiero reemplazar a HK2 con daga.

Las clases de recursos se ven así:

@Path("/example") public final class ExampleResource { private final Dependency dependency; @Inject public ExampleResource(final Dependency dependency) { this.dependency = Objects.requireNonNull(dependency); } @GET @Produces(MediaType.APPLICATION_JSON) public Example getExample() { return this.dependency.giveExample(); } }

Y el componente Dagger podría, por ejemplo, definirse como sigue:

@Component public interface Application { public ExampleResource exampleEndpoint(); public XyzResource xyzEndpoint(); // etc. }

Para que el método principal se vea similar a:

public final class Main { public static void main(final String[] args) { final Application application = DaggerApplication.create(); final URI baseUri = UriBuilder.fromUri("http://0.0.0.0/").port(80).build(); final ResourceConfig resourceConfig = new ResourceConfig(); // how to initialize `resourceConfig` using `application`? final HttpServer httpServer = GrizzlyHttpServerFactory .createHttpServer(baseUri, resourceConfig, false); try { httpServer.start(); } catch (final IOException ex) { ... } } }

La ejecución de la aplicación da como resultado inmediatamente una excepción: IllegalStateException: InjectionManagerFactory not found. Parece que se necesita una implementación Daga de esta fábrica.

Mi pregunta es: ¿cómo integrar Dagger con Jersey?


Debe implementar un InjectionManagerFactory que devolverá un InjectionManager delegado a Dagger y registrarlo como un servicio al colocar una entrada en META-INF/services , similar a la hk2 aquí: https://github.com/jersey/jersey/blob/master/inject/hk2/src/main/resources/META-INF/services/org.glassfish.jersey.internal.inject.InjectionManagerFactory pero https://github.com/jersey/jersey/blob/master/inject/hk2/src/main/resources/META-INF/services/org.glassfish.jersey.internal.inject.InjectionManagerFactory referencia a su propia implementación.