DropWizard 0.7.1 から 0.8.1 に移行中です。これには、Jersey 1.x から 2.x への移行が含まれます。Jersey 1.18.1 を使用する私の実装では、実装するMyProvider
(簡単にするためにすべてのクラス名を変更しました) がありましたInjectableProvider
。このクラスはMyInjectable
、カスタム注入アノテーションを含むオブジェクトを作成しますMyToken
。MyToken
によって渡され、読み取られるさまざまな属性が含まれていますMyInjectable
。最後に、以下に示すように、Application
クラスに の新しいインスタンスを登録しMyProvider
ます。
私はいくつかの調査を行いましたが、Jersey 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)));