20

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

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

编辑:有关我在尝试遵循 Michal 的指南时遇到的更多问题,请参阅此问题。

4

2 回答 2

22

您需要从 HK2实现InjectionResolver<T>接口。查看 Jersey 工作区中现有的实现:

一旦你有了这个,你需要从 HK2 扩展AbstractBinderInjectionResolver并通过它的#configure()方法绑定你:

public class MyResolverBinder extends AbstractBinder {

    @Override
    protected void configure() {
        bind(MyInjectionResolver.class)
                .to(new TypeLiteral<InjectionResolver<MyAnnotation>>() {})
                .in(Singleton.class);
    }
}

...并在您的应用程序类(或通过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;
    }
}

注册MyResolverBinderFeatureResourceConfig

new ResourceConfig()
        // Register either MyFeature
        .register(MyFeature.class)
        // or MyResolverBinder
        .register(new MyResolverBinder())
        // Register other providers or resources
        .packages("my.package");
于 2013-08-27T12:05:28.467 回答
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 效果很好。

于 2014-09-20T10:11:04.170 回答