![](/img/trans.png)
[英]CDI: Injecting single instance works, but injecting Instance<> does not. Why?
[英]CDI: @Produces method is not injecting after invoking Instance with an AnnotationLiteral
我試圖通過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
了的“d成員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托管bean,不應該實例化返回值,而是將其作為參數傳遞給方法,並返回此參數作為結果。
@Produces
@Dependent
@I18nResource
public FacesI18nService produceFacesService(InjectionPoint ip, @New FacesI18nService ret) {
[...]
ret.setI18nService(new I18nService(domain, databaseBundleService));
return ret;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.