Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泽西岛2号。*。如何替换Jersey 1的InjectableProvider和AbstractHttpContextInjectable*_Java_Dependency Injection_Jersey_Jax Rs - Fatal编程技术网

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");