Джерси 2.x пользовательские аннотации инъекций с атрибутами
Я нахожусь в процессе миграции с DropWizard 0.7.1 на 0.8.1. Это включает в себя миграцию с Джерси 1.x на 2.x. В моей реализации, которая использует Джерси 1.18.1, у меня былMyProvider
(изменил все имена классов для простоты), который реализуетInjectableProvider
, Этот класс создастMyInjectable
объекты, содержащие пользовательскую аннотацию впрыска,MyToken
. MyToken
содержит различные атрибуты, которые передаются и читаютсяMyInjectable
, Наконец, вApplication
класс я регистрирую новый экземплярMyProvider
, как видно ниже.
Я провел некоторое исследование и, похоже, не могу понять, как я воссоздаю (или, полагаю, заменю) такой сценарий в Джерси 2.x.
Вот текущая реализация 1.18.1:
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.PARAMETER, ElementType.FIELD })
public @interface MyToken {
// Custom annotation containing various attributes
boolean someAttribute() default true;
// ...
}
public class MyProvider implements InjectableProvider<MyToken, Parameter> {
// io.dropwizard.auth.Authenticator
private final Authenticator<String, MyObject> authenticator;
public MyProvider(Authenticator<String, MyObject> authenticator) {
this.authenticator = authenticator;
}
@Override
public ComponentScope getScope() {
return ComponentScope.PerRequest;
}
@Override
public Injectable<?> getInjectable(ComponentContext ic, MyToken t, Parameter p) {
return new MyInjectable(authenticator, t.someAttribute());
}
}
class MyInjectable extends AbstractHttpContextInjectable<MyObject> {
private final Authenticator<String, Session> authenticator;
private final boolean someAttribute;
public MyInjectable(Authenticator<String, MyObject> authenticator, boolean someAttribute) {
this.authenticator = authenticator;
this.someAttribute = someAttribute;
// ... Removed a few paramters for simplicity's sake
}
@Override
public MyObject getValue(HttpContext c) {
final HttpRequestContext request = c.getRequest();
// ... Removed code not pertaining to the question
return myObject;
}
}
// Lastly, the register call in the io.dropwizard.Application class
environment.jersey().register(new MyProvider(new MyProviderValidator(someValidator)));