11

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

1 に答える 1