Как заставить Джерси работать с инъекцией зависимости кинжала?

На Джерси обычно используется внедрение зависимостей 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, где содержатся подробные инструкции по использованию.