泽西岛2. *。 如何替换Jersey 1的InjectableProvider和AbstractHttpContextInjectable
我想创建一个类,其对象可以使用@Context
注释(或者更好的是自定义注释,用于需要将参数传递给注释的情况)注入资源方法。 在Jersey 1. *我会使用InjectableProvider
(在我的情况下与AbstractHttpContextInjectable
一起使用)。 我想要实现的就像来自dropwizard的 @Auth
[ 1 ](使用Jersey 1.7)。
据我所知,泽西岛的注射能力被HK2取代,我找不到任何我所描述的例子。
编辑:请参阅此问题 ,了解我在尝试按照Michal的指南时遇到的其他问题。
您需要从HK2实现InjectionResolver
- 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
注册MyResolverBinder
或Feature
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运行良好。