簡體   English   中英

CDI:@Produces方法在使用AnnotationLiteral調用Instance后沒有注入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM