泽西岛2. *。 如何替换Jersey 1的InjectableProvider和AbstractHttpContextInjectable

我想创建一个类,其对象可以使用@Context注释(或者更好的是自定义注释,用于需要将参数传递给注释的情况)注入资源方法。 在Jersey 1. *我会使用InjectableProvider (在我的情况下与AbstractHttpContextInjectable一起使用)。 我想要实现的就像来自dropwizard的 @Auth [ 1 ](使用Jersey 1.7)。

据我所知,泽西岛的注射能力被HK2取代,我找不到任何我所描述的例子。

编辑:请参阅此问题 ,了解我在尝试按照Michal的指南时遇到的其他问题。

您需要从HK2实现InjectionResolver 接口。 看一下Jersey工作区中现有的实现:

  • ContextInjectionResolver处理@Context
  • ParamInjectionResolver处理@PathParam@QueryParam ,…(通过它的子类)
  • AutowiredInjectResolver处理@Autowired

一旦你有了这个,你需要从HK2扩展AbstractBinder并通过它的#configure()方法绑定你的InjectionResolver

 public class MyResolverBinder extends AbstractBinder { @Override protected void configure() { bind(MyInjectionResolver.class) .to(new TypeLiteral>() {}) .in(Singleton.class); } } 

…并在您的应用程序类中(或通过function )注册此binder的实例:

Feature

 public class MyFeature implements Feature { @Override public boolean configure(final FeatureContext context) { context.register(new MyResolverBinder()); return true; } } 

MyFeature注册到Application

 public class JaxRsApplication extends Application { @Override public Set> getClasses() { final HashSet> classes = new HashSet>(); classes.add(MyFeature.class); // Register other providers or resources. return classes; } } 

ResourceConfig注册MyResolverBinderFeature

 new ResourceConfig() // Register either MyFeature .register(MyFeature.class) // or MyResolverBinder .register(new MyResolverBinder()) // Register other providers or resources .packages("my.package"); 

提供InjectionResolver的实现仅对InjectionResolver帮助,而不是在解析资源方法的参数值时。

至少在Jersey 2.11中,你需要定义一个用ValueFactoryProvider注释的@Provider

 @Provider public class MyValueFactoryProvider implements ValueFactoryProvider { @Inject private MyFactory factory; @Override public Factory getValueFactory(Parameter parameter) { if (parameter.getAnnotation(MyAnnotationParam.class) != null) { return factory; } return null; } @Override public PriorityType getPriority() { return Priority.NORMAL; } } 

如果您还想获取注入的值,例如成员和构造函数参数,那么InjectionResolver运行良好。