Java 泽西岛2号。*。如何替换Jersey 1的InjectableProvider和AbstractHttpContextInjectable*
我想创建一个类,该类的对象可以使用Java 泽西岛2号。*。如何替换Jersey 1的InjectableProvider和AbstractHttpContextInjectable*,java,dependency-injection,jersey,jax-rs,Java,Dependency Injection,Jersey,Jax Rs,我想创建一个类,该类的对象可以使用@Context注释(或者更好的是,在需要将参数传递给注释的情况下使用自定义注释)注入到资源方法中。在Jersey 1.*中,我会使用InjectableProvider(在我的例子中,与AbstractHttpContextInjectable一起使用)。我试图实现的是dropwizard(使用Jersey 1.7)中的@Auth[] 据我所知,泽西岛的注入能力被HK2取代,我找不到任何我所描述的例子 编辑:有关我在尝试遵循Michal指南时遇到的更多问题,请
@Context
注释(或者更好的是,在需要将参数传递给注释的情况下使用自定义注释)注入到资源方法中。在Jersey 1.*中,我会使用InjectableProvider
(在我的例子中,与AbstractHttpContextInjectable一起使用)。我试图实现的是dropwizard(使用Jersey 1.7)中的@Auth
[]
据我所知,泽西岛的注入能力被HK2取代,我找不到任何我所描述的例子
编辑:有关我在尝试遵循Michal指南时遇到的更多问题,请参阅。您需要从HK2实现接口。看看Jersey workspace中现有的实现:
- 处理
@Context
- 处理
@PathParam
,@QueryParam
。。。(通过其子类)
- 处理
@Autowired
一旦你有了这个,你需要从HK2扩展并通过它的#configure()
方法绑定你的InjectionResolver
:
public class MyResolverBinder extends AbstractBinder {
@Override
protected void configure() {
bind(MyInjectionResolver.class)
.to(new TypeLiteral<InjectionResolver<MyAnnotation>>() {})
.in(Singleton.class);
}
}
将MyFeature
注册到应用程序中
:
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;
}
}
提供InjectionResolver
的实现仅对注入有帮助,在解析资源方法的参数值时没有帮助
至少在Jersey 2.11中,您需要定义一个用@Provider
注释的ValueFactoryProvider
@Provider
公共类MyValueFactoryProvider实现ValueFactoryProvider{
@注入
私营工厂;
@凌驾
公共工厂getValueFactory(参数){
if(parameter.getAnnotation(MyAnnotationParam.class)!=null){
返回工厂;
}
返回null;
}
@凌驾
公共优先级类型getPriority(){
返回优先级。正常;
}
}
如果您还希望获得注入的值,例如成员和构造函数参数,则InjectionResolver工作正常。谢谢!这似乎正是我所需要的。Michal,我试着按照你的指导,但我遇到了一个奇怪的警告“…HTTP GET方法…不应该使用任何实体。”。我不知道该怎么做(更多细节请参见编辑我的问题)。你知道是什么引起的吗?谢谢,谢谢你的回答。但是,我不清楚如何创建给定的对象,例如ContainerRequestContext
,以及如何正确处理注入的对象,例如,通过调用close()
。我在网上找不到任何示例,您有什么建议吗?ContainerRequestContext
由Jersey为您创建(您可以在提供商中访问)。如果您需要处理对象,请尝试实现一个@PreDestroy
方法。我是唯一一个感觉到Jersey 1.x中的这一点已经从非常简单和简洁变成了2.x中的极度工程化和繁琐的人吗?
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;
}
}
new ResourceConfig()
// Register either MyFeature
.register(MyFeature.class)
// or MyResolverBinder
.register(new MyResolverBinder())
// Register other providers or resources
.packages("my.package");