我正在尝试通过 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
方法生成的。然而,@Inject
的 FacesI18nService
成员始终是 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/