我想创建一个类,其对象可以使用@Context
注释(或者更好的是自定义注释,用于需要将参数传递给注释的情况)注入资源方法。在Jersey 1. *我会使用InjectableProvider
(在我的情况下与AbstractHttpContextInjectable
一起使用)。我想要实现的是{em> dropwizard (使用Jersey 1.7)中的@Auth
[1]。
据我所知,泽西的注射能力被HK2取代,我找不到任何我所描述的例子。
编辑:有关我在尝试遵循Michal指南时遇到的其他问题,请参阅this question。
答案 0 :(得分:21)
您需要从HK2实施InjectionResolver<T>界面。看一下Jersey工作区中现有的实现:
@Context
@PathParam
,@QueryParam
,...(通过它的子类)@Autowired
完成此操作后,您需要从HK2扩展AbstractBinder并通过InjectionResolver
方法绑定#configure()
:
public class MyResolverBinder extends AbstractBinder {
@Override
protected void configure() {
bind(MyInjectionResolver.class)
.to(new TypeLiteral<InjectionResolver<MyAnnotation>>() {})
.in(Singleton.class);
}
}
...并在您的应用程序类中注册此binder的实例(或通过feature):
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<Class<?>> getClasses() {
final HashSet<Class<?>> classes = new HashSet<Class<?>>();
classes.add(MyFeature.class);
// Register other providers or resources.
return classes;
}
}
在MyResolverBinder
Feature
或ResourceConfig
new ResourceConfig()
// Register either MyFeature
.register(MyFeature.class)
// or MyResolverBinder
.register(new MyResolverBinder())
// Register other providers or resources
.packages("my.package");
答案 1 :(得分:4)
提供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运行良好。