java - Jersey 2.26 : Defining Custom Injection Annotation

标签 java dependency-injection jersey

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

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

如何设置自定义注入(inject)注释?

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

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

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

我非常感谢一个示例,说明如何使用自定义注解进行注入(inject)再次在 Jersey 2.26 上工作。

最佳答案

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

抽象绑定(bind)器

.... 

@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);
}
....

当前用户供应商

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;
    }
}

关于java - Jersey 2.26 : Defining Custom Injection Annotation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49317957/

相关文章:

java - 返回类型的一致性

dependency-injection - 将连接字符串注入(inject) DI 解析的类

rest - Jersey REST 支持简历/媒体流

java - 在Java中以允许它们改变的方式存储字母?

java - 我想设置 s3 对象特定保留

java - 如何检查光标是否在ResultSet的插入行中?

unit-testing - 具有提供者依赖性的 Angular2 测试组件

symfony - 如何从 Symfony 中的编译器传递注入(inject)共享服务

Jersey 和 Odata key 路径参数格式

java - 获取响应主体对象中的自定义字段