jakarta-ee - CDI:@Produces 方法在使用 AnnotationLiteral 调用实例后未注入(inject)

标签 jakarta-ee dependency-injection cdi

我正在尝试通过 AnnotationLiteral 调用它来解析 CDI 托管 bean:

@Inject
@Any
private Instance<FacesI18nService> services;

public FacesI18nService produceFacesServiceProgrammatically(Domain domain) {    
    return services.select(new DomainQualifier(domain)).get();
}

DomainQualifier 只是一个标准的 AnnotationLiteral 实现:

public class DomainQualifier extends AnnotationLiteral<I18nResource> implements I18nResource {

    private static final long serialVersionUID = 1L;
    private final Domain domain;

    public DomainQualifier(Domain domain) {
        this.domain = domain;
    }

    @Override
    public Domain value() {
        return domain;
    }

}

问题是我确实得到了一个新的FacesI18nService,它是通过相应的@Produces 方法生成的。然而,@InjectFacesI18nService 成员始终是 null

@Produces
@I18nResource
public FacesI18nService produceFacesService(InjectionPoint ip) {

    for (Annotation a : ip.getQualifiers()) {
        if (a instanceof I18nResource) {
            Domain domain = ((I18nResource) a).value();
            return new FacesI18nService(new I18nService(domain, databaseBundleService));
        }
    }
    throw new IllegalArgumentException("Could not find any matching qualifier");
}

那么,我在这里做错了什么?

最佳答案

好吧..明白了耻辱

为了生成 CDI 托管 beans,不应实例化返回值,而是将其作为参数传递到方法中,然后将此参数作为结果返回。

@Produces
@Dependent
@I18nResource
public FacesI18nService produceFacesService(InjectionPoint ip, @New FacesI18nService ret) {

    [...]

    ret.setI18nService(new I18nService(domain, databaseBundleService));
    return ret;
}

关于jakarta-ee - CDI:@Produces 方法在使用 AnnotationLiteral 调用实例后未注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20423065/

相关文章:

java - 在非托管 CDI Bean 中引用 CDI Bean

java - WAR 中的无状态 ejb > 打包到 EAR > 本地 ejb 调用

jsf - JSF 2.x @ViewScoped 托管 bean 线程安全吗?

java - 如何指示 maven-ejb-plugin 仅包含客户端 EJB 包中所需的类?

swift - View Controller 中的依赖注入(inject)

jakarta-ee - Glassfish - 无法打开管理控制台 - 抛出 NPE

dependency-injection - 当injectionpoint.getBean()可以为null时的CDI

java - RoboGuice wiki 过时了吗? setBaseApplicationInjector 不存在?

java - Java Bean 和企业 Java Bean 的区别?

Tomcat 中的 session 管理