2013-12-16 2 views
0

Мне удалось успешно реализовать пользовательскую аннотацию для инъекций с целевым 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 

Я получаю Привет! обратно, независимо от того, находится ли час в пределах запретного интервала.

ответ

-1

Я не уверен, что это будет работать, но вы можете попробовать это:

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

    public boolean isMethodParameterIndicator() { 
     return true; 
    } 
} 

Предупреждение: Я не пробовал это сам, но в теории, что должно позволить ваш распознаватель работать в качестве параметра метода.

+0

Спасибо, но моя проблема не в целевом параметре, это как добавить метод в качестве цели. – Stine

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