Как заставить Джерси работать с инъекцией зависимости кинжала?
На Джерси обычно используется внедрение зависимостей HK2, но я хотел бы использовать Джерси с Dagger 2. И Dagger, и HK2 реализуют JSR 330, что я взял в качестве доказательства того, что это возможно без особых усилий. Я нашел способы заставить Джерси работать с CDI (например, Weld), Spring DI и Guice, но я ничего не могу найти на Dagger.
Чтобы обеспечить некоторый контекст: я использую сервер Grizzly-Jersey в среде SE, а не в контейнере EE. Мой проект Maven имеет в качестве зависимостей com.google.dagger:dagger
и org.glassfish.jersey.containers:jersey-container-grizzly2-http
, но не org.glassfish.jersey.inject:jersey-hk2
, поскольку я хочу заменить HK2 с кинжалом.
Классы ресурсов выглядят так:
@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();
}
}
И компонент Dagger, например, может быть определен следующим образом:
@Component
public interface Application {
public ExampleResource exampleEndpoint();
public XyzResource xyzEndpoint();
// etc.
}
Чтобы основной метод выглядел примерно так:
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) {
...
}
}
}
При немедленном IllegalStateException: InjectionManagerFactory not found.
приложения возникает исключение: IllegalStateException: InjectionManagerFactory not found.
Кажется, что реализация этой фабрики в Dagger необходима.
У меня вопрос: как интегрировать Dagger с Джерси?
Ответы
Ответ 1
Вам необходимо реализовать InjectionManagerFactory
, который вернет делегирование InjectionManager
в кинжал и зарегистрирует его как услугу, помещая запись в META-INF/services
, похожую на hk2: https://github.com/jersey/jersey/blob/master/inject/hk2/src/main/resources/META-INF/services/org.glassfish.jersey.internal.inject.InjectionManagerFactory, но ссылаясь на вашу собственную реализацию.
Ответ 2
Вот проект интеграции кинжала с Джерси - https://github.com/johnlcox/dagger-servlet
Ознакомьтесь с программой readme, где содержатся подробные инструкции по использованию.