Мне удалось успешно реализовать пользовательскую аннотацию для инъекций с целевым PARAMETER
. Я не понимаю, как сделать свою поддержку поддержки аннотации METHOD
, хотя?Пользовательские аннотации, предназначенные как для МЕТОДА, так и для PARAMETER на Джерси 2
Вот мой пример кода:
Здравствуйте аннотация:
@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
Я получаю Привет! обратно, независимо от того, находится ли час в пределах запретного интервала.
Спасибо, но моя проблема не в целевом параметре, это как добавить метод в качестве цели. – Stine