欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot-啟動(dòng)bean沖突的解決

 更新時(shí)間:2022年03月24日 11:31:08   作者:鬼~離未罔兩  
這篇文章主要介紹了springboot-啟動(dòng)bean沖突的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

啟動(dòng)bean沖突

在一次啟動(dòng)中遇到了bean沖突的問(wèn)題,提示存在兩個(gè)名稱(chēng)重復(fù)的bean

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.test.api.Application]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'healthCheckController' for bean class [com.test.datahub.controller.HealthCheckController] conflicts with existing, non-compatible bean definition of same name and class [com.test.api.controller.HealthCheckController]

項(xiàng)目中包括多個(gè)模塊,其中A、B兩個(gè)模塊都有同一個(gè)類(lèi):

HealthCheckController,檢查更改信息發(fā)現(xiàn),不知道誰(shuí)在A模塊添加了B模塊的依賴(lài),造成了這一問(wèn)題,刪除后解決

? ? ? ? <dependency>
? ? ? ? ? ? <groupId>com.test</groupId>
? ? ? ? ? ? <artifactId>B</artifactId>
? ? ? ? ? ? <version>1.0.0-SNAPSHOT</version>
? ? ? ? </dependency>

啟動(dòng)提示bean重復(fù)問(wèn)題

先說(shuō)結(jié)論

只需要在@FeignClient注解的contextId屬性上加上獨(dú)一的標(biāo)示,即可解決問(wèn)題

原理

是因?yàn)樽?cè)feignClient的時(shí)候會(huì)注冊(cè)ClientConfiguration,參考代碼如下

public void registerFeignClients(AnnotationMetadata metadata,
? ? ? BeanDefinitionRegistry registry) {
? ?//...此處省略部分代碼
? ?//
? ?for (String basePackage : basePackages) {
? ? ? Set<BeanDefinition> candidateComponents = scanner
? ? ? ? ? ? .findCandidateComponents(basePackage);
? ? ? for (BeanDefinition candidateComponent : candidateComponents) {
? ? ? ? ?if (candidateComponent instanceof AnnotatedBeanDefinition) {
? ? ? ? ? ? // verify annotated class is an interface
? ? ? ? ? ? //...省略部分代碼
?
? ? ? ? ? ? //這塊是把注解上的所有屬性封裝到map上
? ? ? ? ? ? Map<String, Object> attributes = annotationMetadata
? ? ? ? ? ? .getAnnotationAttributes(
? ? ? ? ? ? FeignClient.class.getCanonicalName());
?
? ? ? ? ? ? //這兩個(gè)重點(diǎn)方法請(qǐng)看下面代碼塊
?
? ? ? ? ? ? //獲取該feignClient的名字(重點(diǎn)關(guān)注該方法)
? ? ? ? ? ? String name = getClientName(attributes);
?
? ? ? ? ? ? //此方法就是spring注入beanDefination的步驟(重點(diǎn)關(guān)注該方法)
? ? ? ? ? ? registerClientConfiguration(registry, name,
? ? ? ? ? ? ? ? ? attributes.get("configuration"));
?
? ? ? ? ? ? registerFeignClient(registry, annotationMetadata, attributes);
? ? ? ? ?}
? ? ? }
? ?}
}

上面的兩處重點(diǎn)方法, 請(qǐng)看此處

//@param client 這個(gè)map就是通過(guò)上面的注解屬性轉(zhuǎn)map得到的
private String getClientName(Map<String, Object> client) {
? ?if (client == null) {
? ? ? return null;
? ?}
? ?//如果從contextId獲取到名字,那么value有值的
? ?String value = (String) client.get("contextId");
? ?//如果value有值,那么如下3個(gè)if條件都不會(huì)走,所以contextId唯一就可以做到bean不重復(fù),
? ?//如果value沒(méi)有值,就會(huì)取value,因?yàn)槎鄠€(gè)client的serverName都是一樣的,那么就會(huì)出現(xiàn)重復(fù)bean
? ?if (!StringUtils.hasText(value)) {
? ? ? value = (String) client.get("value");
? ?}
? ?if (!StringUtils.hasText(value)) {
? ? ? value = (String) client.get("name");
? ?}
? ?if (!StringUtils.hasText(value)) {
? ? ? value = (String) client.get("serviceId");
? ?}
? ?if (StringUtils.hasText(value)) {
? ? ? return value;
? ?}
?
? ?throw new IllegalStateException("Either 'name' or 'value' must be provided in @"
? ? ? ? ?+ FeignClient.class.getSimpleName());
}
?
private void registerClientConfiguration(BeanDefinitionRegistry registry, Object name,
? ? ? Object configuration) {
? ?BeanDefinitionBuilder builder = BeanDefinitionBuilder
? ? ? ? ?.genericBeanDefinition(FeignClientSpecification.class);
? ?builder.addConstructorArgValue(name);
? ?builder.addConstructorArgValue(configuration);
? ?//在這個(gè)位置,創(chuàng)建beanDefinition,但是他創(chuàng)建的名字格式可以看出,唯一改變變量就是name,這個(gè)name就是上面看到的那個(gè)方法獲取的
? ?registry.registerBeanDefinition(
? ? ? ? ?name + "." + FeignClientSpecification.class.getSimpleName(),
? ? ? ? ?builder.getBeanDefinition());
}

以上就是feign導(dǎo)致的springBean重復(fù)問(wèn)題的解釋?zhuān)瑑H上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring Boot實(shí)現(xiàn)郵件服務(wù)(附:常見(jiàn)郵箱的配置)

    Spring Boot實(shí)現(xiàn)郵件服務(wù)(附:常見(jiàn)郵箱的配置)

    這篇文章主要給大家介紹了關(guān)于Spring Boot實(shí)現(xiàn)郵件服務(wù)的相關(guān)資料,文中還附上了常見(jiàn)郵箱的配置,通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • 關(guān)于@Bean的使用方式

    關(guān)于@Bean的使用方式

    這篇文章主要介紹了關(guān)于@Bean的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Java中通過(guò)ZipOutputStream類(lèi)如何將多個(gè)文件打成zip

    Java中通過(guò)ZipOutputStream類(lèi)如何將多個(gè)文件打成zip

    ZipOutputStream?是Java中用于創(chuàng)建ZIP文件的類(lèi),它是?java.util.zip?包中的一部分,通過(guò)使用?ZipOutputStream?,可以將多個(gè)文件壓縮到一個(gè)ZIP文件中,這篇文章主要介紹了Java中(ZipOutputStream)如何將多個(gè)文件打成zip,需要的朋友可以參考下
    2023-09-09
  • 解析Java中PriorityQueue優(yōu)先級(jí)隊(duì)列結(jié)構(gòu)的源碼及用法

    解析Java中PriorityQueue優(yōu)先級(jí)隊(duì)列結(jié)構(gòu)的源碼及用法

    優(yōu)先級(jí)隊(duì)列是一種隊(duì)列結(jié)構(gòu),是0個(gè)或多個(gè)元素的集合,每個(gè)元素都有一個(gè)優(yōu)先權(quán),PriorityQueue被內(nèi)置于JDK中,本文就來(lái)解析Java中PriorityQueue優(yōu)先級(jí)隊(duì)列結(jié)構(gòu)的源碼及用法.
    2016-05-05
  • IDEA連接postgressql數(shù)據(jù)庫(kù)操作

    IDEA連接postgressql數(shù)據(jù)庫(kù)操作

    這篇文章主要介紹了IDEA連接postgressql數(shù)據(jù)庫(kù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Java中的代理原理及代理使用示例

    Java中的代理原理及代理使用示例

    這篇文章主要介紹了Java中的代理原理及代理使用示例,本文講解了Java Socket編程中加入代理的2種方法,需要的朋友可以參考下
    2015-03-03
  • java中字符進(jìn)行全角半角轉(zhuǎn)換示例代碼

    java中字符進(jìn)行全角半角轉(zhuǎn)換示例代碼

    全角:指一個(gè)字符占用兩個(gè)標(biāo)準(zhǔn)字符位置,而半角:指一字符占用一個(gè)標(biāo)準(zhǔn)的字符位置,在日常開(kāi)發(fā)中經(jīng)常會(huì)遇到全角半角轉(zhuǎn)換的要求,下面這篇文章主要給大家介紹了關(guān)于java中字符進(jìn)行全角半角轉(zhuǎn)換的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-08-08
  • Java窗口精細(xì)全方位講解

    Java窗口精細(xì)全方位講解

    這篇文章呢,將會(huì)系統(tǒng)的精細(xì)的教會(huì)鐵鐵們?nèi)绾巫约簩?xiě)一個(gè)完整的窗口;看完之后窗口穩(wěn)拿下!!!所以呢由于詳細(xì),知識(shí)點(diǎn)多,可能有點(diǎn)長(zhǎng),鐵鐵們慢慢仔細(xì)閱讀吧;文章寫(xiě)的還是一如既往快樂(lè)的,哈哈哈
    2021-08-08
  • Springmvc實(shí)現(xiàn)文件下載2種實(shí)現(xiàn)方法

    Springmvc實(shí)現(xiàn)文件下載2種實(shí)現(xiàn)方法

    這篇文章主要介紹了Springmvc實(shí)現(xiàn)文件下載2種實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 使用Java操作TensorFlow的方法

    使用Java操作TensorFlow的方法

    TensorFlow是一個(gè)功能強(qiáng)大且廣泛使用的框架,它不斷得到改進(jìn),并最近被引入新語(yǔ)言包括Java和JavaScript,這篇文章主要介紹了如何使用Java操作TensorFlow,需要的朋友可以參考下
    2023-05-05

最新評(píng)論