2013-12-15 4 views
5

Как мне привязать 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.":

ответ

4

Найдено решение! Я добавил

if (parameter.getAnnotation(Hello.class) == null) return null; 

и

if (parameter.getAnnotation(SmallTalk.class) == null) return null; 

к createValueFactory методе два значения заводских поставщиков.

+0

Это тоже работало для меня, но это кажется настолько нелогичным. Там должен быть лучший путь. Вы нашли один, @Stine? –

+0

Одним из немногих улучшенных решений будет параметр.setSourceAnnotation() instanceof Hello. Я знаю, не намного лучше, но, по крайней мере, метод, кажется, существует для самой цели проверки аннотации, которая вызвала инъекцию. – wujek

Смежные вопросы