Определить пользовательский InjectionResolver для @Inject - PullRequest
0 голосов
/ 21 мая 2019

Моя цель - добавить некоторую дополнительную логику вокруг System Injection Resolver (так сказать, для его украшения).По сути, я хочу зарегистрировать пользовательский распознаватель инъекций (например, описанный здесь ), но для аннотации javax.inject.@Inject.Настройка работает, если я создаю другую пользовательскую аннотацию, но не при использовании @Inject.Моя реализация выглядит следующим образом:

Решение для инъекций:

@Singleton
@Rank(Integer.MAX_VALUE)
public class InjectInjectionResolver
    implements InjectionResolver<Inject> {

    private final InjectionResolver<Inject> injectionResolver;

    @Inject
    public InjectInjectionResolver(
            @Named(InjectionResolver.SYSTEM_RESOLVER_NAME) final InjectionResolver<Inject> injectionResolver) {
        this.injectionResolver = injectionResolver;
    }

    @Override
    public Object resolve(final Injectee injectee, final ServiceHandle<?> root) {
        throw new RuntimeException("Why is this never called?");
    }

    @Override
    public boolean isConstructorParameterIndicator() {
        return injectionResolver.isConstructorParameterIndicator();
    }

    @Override
    public boolean isMethodParameterIndicator() {
        return injectionResolver.isMethodParameterIndicator();
    }
}

И я регистрирую распознаватель следующим образом (внутри ResourceConfig):

register(new AbstractBinder() {

        @Override
        protected void configure() {
            bind(InjectInjectionResolver.class).to(new GenericType<InjectionResolver<Inject>>() {}).in(Singleton.class);
        }
    });

Что я пробовалдо сих пор:

  • с использованием @Rank
  • с использованием org.glassfish.jersey.internal.inject.AbstractBinder или org.glassfish.hk2.utilities.binding.AbstractBinder с TypeLiteral, наряду с реализацией org.glassfish.hk2.api.InjectionResolver или org.glassfish.jersey.internal.inject.InjectionResolver
  • убедившись, что та же самая установка работает с @CustomAnnotation (где вызываются и конструктор, и методы разрешения)

Кто-нибудь знает, как решить эту проблему?

Версииused: jersey 2.27

EDIT: Когда я @ Inject сам InjectionResolver, кажется, что hk2 org.jvnet.hk2.internal.ThreeThirtyResolver вводится для org.glassfish.hk2.api.InjectionResolver, в то время как мой пользовательский преобразователь инъекций вводится для org.glassfish.jersey.internal.inject.InjectionResolver.Однако пользовательский распознаватель инъекций используется для , а не для инъекций.

1 Ответ

0 голосов
/ 27 мая 2019

Следующая конфигурация работает для меня, спасибо @ jwells131313 за возвращение меня в нужное русло. Я пытался использовать полные имена, иначе это, вероятно, из пакета javax.inject.*.

@Singleton
@Rank(Integer.MAX_VALUE)
@org.jvnet.hk2.annotations.Service
public class MyHk2InjectionResolver
    implements org.glassfish.hk2.api.InjectionResolver<Inject> {

    private final org.glassfish.hk2.api.InjectionResolver<Inject> injectionResolver;

    @Inject
    public MyHk2InjectionResolver(
        @Named(org.glassfish.hk2.api.InjectionResolver.SYSTEM_RESOLVER_NAME) final org.glassfish.hk2.api.InjectionResolver<Inject> injectionResolver) {
        this.injectionResolver = injectionResolver;
    }

    // ... required methods, could just delegate to system resolver

}

Чтобы зарегистрировать распознаватель, мы привязываем его к правильному типу (я делаю это в ResourceConfig приложения jersey):

register(new org.glassfish.hk2.utilities.binding.AbstractBinder() {

        @Override
        protected void configure() {
            bind(MyHk2InjectionResolver.class)
                    .to(new org.glassfish.hk2.api.TypeLiteral<org.glassfish.hk2.api.InjectionResolver<Inject>>() {})
                    .in(Singleton.class);
        }
    });

С помощью этой настройки вы можете продолжать использовать аннотацию @Inject и написать вокруг нее некоторую пользовательскую логику внедрения, возможно, используя в качестве запасного варианта системный преобразователь инъекций по умолчанию.

...