Как мне привязать ValueFactoryProvider, чтобы иметь две пользовательские аннотации для инъекций, сосуществующие в Jersey 2? Ниже я привел пример моего текущего подхода и, поскольку вы можете видеть, что инъекция аннота Hello «скрывает» инъекцию аннотаций SmallTalk.Две пользовательские аннотации для инжекции в Джерси 2
Здравствуйте аннотация:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface Hello {
}
SmallTalk аннотация:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface SmallTalk {
}
Здравствуйте аннотацию распознаватель:
@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) {
final Class<?> classType = parameter.getRawType();
if (classType == null || (!classType.equals(String.class))) return null;
return new AbstractContainerRequestValueFactory<String>() {
@Override
public String provide() {
return "Hello!";
}
};
}
}
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);
}
}
}
SmallTalk аннотацию распознаватель:
@Singleton
public class SmallTalkResolver {
public static class SmallTalkInjectionResolver extends ParamInjectionResolver<SmallTalk> {
public SmallTalkInjectionResolver() {
super(SmallTalkValueFactoryProvider.class);
}
}
@Singleton
public static class SmallTalkValueFactoryProvider extends AbstractValueFactoryProvider {
@Inject
public SmallTalkValueFactoryProvider(final MultivaluedParameterExtractorProvider extractorProvider,
final ServiceLocator injector) {
super(extractorProvider, injector, UNKNOWN);
}
@Override
protected Factory<?> createValueFactory(final Parameter parameter) {
final Class<?> classType = parameter.getRawType();
if (classType == null || (!classType.equals(String.class))) return null;
return new AbstractContainerRequestValueFactory<String>() {
@Override
public String provide() {
return "Nice weather.";
}
};
}
}
public static class Binder extends AbstractBinder {
@Override
protected void configure() {
bind(SmallTalkValueFactoryProvider.class).to(ValueFactoryProvider.class).in(Singleton.class);
bind(SmallTalkInjectionResolver.class).to(
new TypeLiteral<InjectionResolver<SmallTalk>>() {
}
).in(Singleton.class);
}
}
}
Конфигурация
Ресурс:
public class MyApplication extends ResourceConfig {
public MyApplication() {
register(new HelloResolver.Binder());
register(new SmallTalkResolver.Binder());
registerClasses(HelloResource.class);
}
}
ресурсов с использованием как аннотаций инъекций:
@Path("/")
public class HelloResource {
@GET
@Path("hello")
@Produces("application/json")
public String hello(@Hello final String hello, @SmallTalk final String smallTalk) {
return hello + " " + smallTalk;
}
}
Результат при запросе ресурса - должен был "Hello! Nice weather."
:
Это тоже работало для меня, но это кажется настолько нелогичным. Там должен быть лучший путь. Вы нашли один, @Stine? –
Одним из немногих улучшенных решений будет параметр.setSourceAnnotation() instanceof Hello. Я знаю, не намного лучше, но, по крайней мере, метод, кажется, существует для самой цели проверки аннотации, которая вызвала инъекцию. – wujek