簡體   English   中英

Spring 5 - @Bean 方法的自定義限定符 - NoSuchBeanDefinitionException

[英]Spring 5 - custom qualifiers for @Bean methods - NoSuchBeanDefinitionException

我一直在努力將自定義@Qualifier 與@Bean 結合使用而不是工廠方法。 它看起來像這樣:

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, 
ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface MyCustomQualifierUno {
    String value() default "";
}

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, 
ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface MyCustomQualifierDos {
    String value() default "";
}

所需豆類的工廠 class 包括以下兩種方法:

@Bean
@MyCustomQualifierUno
public RestTemplate getRestTemplate(SomeConfigUno config,
    SomeErrorHandlerUno errorHandler) {
        return new RestTemplateBuilder()
            (...)
            .build();
}

@Bean
@MyCustomQualifierDos
public RestTemplate getRestTemplate(SomeConfigDos config,
    SomeErrorHandlerDos errorHandler) {
        return new RestTemplateBuilder()
            (...)
            .build();
}

接下來,在客戶端 class 中,我進行了 ctor 注入,如下所示:

public SomeClientUno(@SomeQualifierUno RestTemplate 
    restTemplate) {
        this.restTemplate = restTemplate;
}

public SomeClientDos(@SomeQualifierDos RestTemplate 
    restTemplate) {
        this.restTemplate = restTemplate;
}

當我嘗試運行應用程序時,我得到: NoSuchBeanDefinitionException

相當有趣的事實是,當我添加一個專用的 class 擴展 RestTemplate 並將我的 @CustomQualifier 放在那里時,我得到了異常,現在實際上有兩個 bean(即現在它確實考慮了 @Bean 方法)!

運行通過:IntelliJ Ultimate 2019.1 操作系統:Windows 10 64bit Java:1.8.0_191 Spring版本:

PS。 那些“Uno's 和 'Dos'ses 是為了強調一個事實,這些是一些具體的類型,完全不相關,但不要與 @Qualifiers 中的“Uno's 和 'Dos'ses 混淆

這似乎太明顯了,但是為什么要使用限定符呢? 假設您這樣定義 bean:

@Bean
public RestTemplate restTemplateUno(...) { ... }

@Bean
public RestTemplate restTemplateDos(...) { ... }

這會使用限定符“restTemplateUno”和“restTemplateDos”注冊 bean,因為“默認情況下,bean 名稱將與方法名稱相同”(有關詳細信息,請參閱Spring 文檔)。

您現在可以將它們注入客戶端構造函數中,如下所示:

@Autowired
public SomeClientUno(RestTemplate restTemplateUno) {...}

@Autowired
public SomeClientDos(RestTemplate restTemplateDos) {...}

我希望這會有所幫助,並且我沒有錯過一些明顯的事情,這些事情導致您首先考慮使用限定符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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