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

时间:2013-08-27 10:47:35

标签: java dependency-injection jersey jax-rs

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

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

编辑:有关我在尝试遵循Michal指南时遇到的其他问题,请参阅this question

2 个答案:

答案 0 :(得分:21)

您需要从HK2实施InjectionResolver<T>界面。看一下Jersey工作区中现有的实现:

完成此操作后,您需要从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

中注册FeatureResourceConfig
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运行良好。