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.