Джерси 2. *. Как заменить InjectableProvider и AbstractHttpContextInjectable of Jersey 1. * - программирование
Подтвердить что ты не робот

Джерси 2. *. Как заменить InjectableProvider и AbstractHttpContextInjectable of Jersey 1. *

Я хотел бы создать класс, объекты которого могут быть добавлены с помощью аннотации @Context (или, еще лучше, пользовательской аннотации для случаев, когда мне нужно передать аргумент аннотации) в методы ресурсов. В Джерси 1. * Я бы использовал InjectableProvider (в моем случае вместе с AbstractHttpContextInjectable). То, что я пытаюсь достичь, это нечто вроде @Auth [1] из dropwizard (в котором используется Джерси 1.7).

Возможности инъекции Джерси были заменены на HK2, насколько я знаю, и я не мог найти ни одного примера того, что я описываю.

Изменить: см. этот вопрос для дальнейших проблем, с которыми я столкнулся, пытаясь следовать руководству Михала.

4b9b3361

Ответ 1

Вам нужно реализовать интерфейс InjectionResolver < T от HK2. Взгляните на существующие реализации, которые присутствуют в рабочем пространстве Джерси:

Как только у вас есть это, вам нужно расширить AbstractBinder из HK2 и связать ваш InjectionResolver с помощью метода #configure():

public class MyResolverBinder extends AbstractBinder {

    @Override
    protected void configure() {
        bind(MyInjectionResolver.class)
                .to(new TypeLiteral<InjectionResolver<MyAnnotation>>() {})
                .in(Singleton.class);
    }
}

... и зарегистрируйте экземпляр этого связующего в вашем классе приложения (или через feature):

Feature:

public class MyFeature implements Feature {

    @Override
    public boolean configure(final FeatureContext context) {
        context.register(new MyResolverBinder());
        return true;
    }
}

зарегистрировать MyFeature в Application:

public class JaxRsApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        final HashSet<Class<?>> classes = new HashSet<Class<?>>();
        classes.add(MyFeature.class);
        // Register other providers or resources.
        return classes;
    }
}

зарегистрировать MyResolverBinder или Feature в ResourceConfig

new ResourceConfig()
        // Register either MyFeature
        .register(MyFeature.class)
        // or MyResolverBinder
        .register(new MyResolverBinder())
        // Register other providers or resources
        .packages("my.package");

Ответ 2

Предоставление реализации InjectionResolver помогает только с введением, а не при разрешении значений параметров ресурсного метода.

По крайней мере, с Джерси 2.11 вам нужно определить ValueFactoryProvider, аннотированный с помощью @Provider.

@Provider
public class MyValueFactoryProvider implements ValueFactoryProvider {

    @Inject
    private MyFactory factory;

    @Override
    public Factory<?> getValueFactory(Parameter parameter) {
        if (parameter.getAnnotation(MyAnnotationParam.class) != null) {
            return factory;
        }

        return null;
    }

    @Override
    public PriorityType getPriority() {
        return Priority.NORMAL;
    }

}

Если вы также хотите получить значение, введенное в, например, члены и параметры конструктора, тогда InjectionResolver работает хорошо.