0

target を使用してカスタム インジェクション アノテーションを実装することに成功しましたPARAMETER。注釈サポートのターゲットをどのように作成するのかわかりませんMETHODか?

ここに私のサンプルコードがあります:

こんにちは注釈:

@Retention(RUNTIME)
@Target({METHOD, PARAMETER})
public @interface Hello {
}

こんにちは注釈リゾルバ:

@Singleton
public class HelloResolver {
    public static class HelloInjectionResolver extends ParamInjectionResolver<Hello> {
        public HelloInjectionResolver() {
            super(HelloValueFactoryProvider.class);
        }
    }

    @Singleton
    public static class HelloValueFactoryProvider extends AbstractValueFactoryProvider {
        @Inject
        public HelloValueFactoryProvider(final MultivaluedParameterExtractorProvider extractorProvider,
                                         final ServiceLocator injector) {
            super(extractorProvider, injector, UNKNOWN);
        }

        @Override
        protected Factory<?> createValueFactory(final Parameter parameter) {
            if (!String.class.equals(parameter.getRawType())) return null;
            if (parameter.getAnnotation(Hello.class) == null) return null;
            return new AbstractContainerRequestValueFactory<String>() {
                @Override
                public String provide() {
                    final DateTime now = DateTime.now();
                    if (22 < now.getHourOfDay() || now.getHourOfDay() < 6) {
                        throw new WebApplicationException(FORBIDDEN);
                    } else {
                        return format("Hello, it is %s o'clock so I am awake! :)", forPattern("HH:mm").print(now));
                    }
                }
            };
        }
    }

    public static class Binder extends AbstractBinder {
        @Override
        protected void configure() {
            bind(HelloValueFactoryProvider.class).to(ValueFactoryProvider.class).in(Singleton.class);
            bind(HelloInjectionResolver.class).to(
                    new TypeLiteral<InjectionResolver<Hello>>() {
                    }
            ).in(Singleton.class);
        }
    }
}

こんにちはリソース:

@Path("hello")
public class HelloResource {
    @GET
    @Path("method")
    @Produces(APPLICATION_JSON)
    @Hello
    public String method() {
        return "Hello!";
    }

    @GET
    @Path("param")
    @Produces(APPLICATION_JSON)
    public String param(@Hello final String hello) {
        return hello;
    }
}

打った時

http://localhost:8080/hello/method

こんにちは!時間が禁止された間隔内であるかどうかに関係なく戻ります。

4

1 に答える 1

-1

これが機能するかどうかはわかりませんが、これを試すことができます:

public static class HelloInjectionResolver extends ParamInjectionResolver<Hello> {
    public HelloInjectionResolver() {
        super(HelloValueFactoryProvider.class);
    }

    public boolean isMethodParameterIndicator() {
        return true;
    } 
}

警告: 私はこれを自分で試したことはありませんが、理論的には、リゾルバーがメソッドのパラメーターとして機能できるようにする必要があります。

于 2013-12-17T02:11:48.267 に答える