【问题标题】:Jersey 2.26: Defining Custom Injection AnnotationJersey 2.26:定义自定义注入注解
【发布时间】:2018-03-16 10:05:13
【问题描述】:

我正在将 JavaSE 应用程序从 Jersey 2.x 迁移到 2.26。应用依赖 HK2 进行依赖注入。

不幸的是,一些官方文档 - custom injection, chapter 23 - 现在不正确并且尚未更新。在 his answer here 中,Paul 解释了如何将 HK2 Factory 迁移到 Supplier,jersey 现在使用它来设置自定义注入提供程序。效果很好,但我想在本章的其余部分寻求帮助:

如何设置自定义注入注解?

目前,我现有的自定义注入解析器类(完全按照文档)编译得很好。我不确定他们是否应该继续直接实施org.glassfish.hk2.api.InjectionResolver?在 javadocs 中,我找到了 InjectionResolverWrapper,我需要扩展它吗?

真正的问题是如何将注入解析器绑定到自定义注入。这不编译:

            bind(SessionInjectResolver.class)
                .to(new TypeLiteral<InjectionResolver<SessionInject>>(){})
                .in(Singleton.class);

我非常感谢一个示例,如何使用自定义注释再次在 Jersey 2.26 上进行注入。

【问题讨论】:

  • 我只是在玩了一下,发现bind(new SessionInjectioResolver()) 有效。但我还没有弄清楚如何让解析器内部的注入工作。这通常是绑定作为一个类发挥作用的地方,但我还没有想出来。
  • 同时检查this out。它仍然将解析器注册为实例,但它使用GenericType 而不是TypeLiteral。我刚刚尝试过,但它似乎不适用于解析器类。我仍然需要使用实例,就像在链接代码中一样
  • 太棒了,保罗:GenericType 为我修好了。我会发布完整的答案。

标签: java dependency-injection jersey


【解决方案1】:

感谢 Paul 关于使用 GenericType 的评论,这里有一个解决方案再次适用于 Jersey 2.26。它使用org.glassfish.hk2.api.* 类。

AbstractBinder

.... 

@Override
protected void configure() {
    /*
    Adds binding for @CurrentUser.
    By default, factories are being injected with PerLookup scope.
    */
    bindFactory(CurrentUserSupplier.class)
            .to(User.class)
            .proxy(true)
            .proxyForSameScope(false)
            .in(RequestScoped.class);
    bind(CurrentUserResolver.class)
            .to(new GenericType<InjectionResolver<CurrentUser>>(){})
            .in(Singleton.class);
}
....

CurrentUserSupplier

public class CurrentUserSupplier implements Supplier<User> {

    // inject what is required

    @Override
    public User get() {
        // do what is necessary to obtain User
    // and return it
    }

}

CurrentUserResolver

import org.glassfish.hk2.api.Injectee;
import org.glassfish.hk2.api.InjectionResolver;
import org.glassfish.hk2.api.ServiceHandle;

public class CurrentUserResolver implements InjectionResolver<CurrentUser> {

    @Inject
    @Named(InjectionResolver.SYSTEM_RESOLVER_NAME)
    InjectionResolver<Inject> systemInjectionResolver;

    @Override
    public Object resolve(Injectee injectee, ServiceHandle<?> handle) {
        if (User.class == injectee.getRequiredType()) {
            return systemInjectionResolver.resolve(injectee, handle);
        }

        return null;
    }

    @Override
    public boolean isConstructorParameterIndicator() {
        return false;
    }

    @Override
    public boolean isMethodParameterIndicator() {
        return false;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 2014-01-13
    • 1970-01-01
    • 2018-12-01
    • 2011-06-13
    相关资源
    最近更新 更多