2013-12-16 101 views
0

我已成功实现了自定义注射注释,目标PARAMETER。我不明白我如何使我的注释支持目标METHOD以及?针对泽西岛2中METHOD和PARAMETER的自定义注释

这里是我的示例代码:

你好注释:

@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