最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

@FeignClient注解中屬性contextId的使用說明

 更新時間:2022年06月18日 11:13:03   作者:goodjob110  
這篇文章主要介紹了@FeignClient注解中屬性contextId的使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

一、概述

如果我們使用Feign定義了兩個接口,但是目標服務是同一個,那么在SpringBoot啟動時就會遇到一個問題:

Description:
The bean 'xxxxxxxx.FeignClientSpecification', defined in null, could not be registered. A bean with that name has already been defined in null and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

二、解決方案

2.1 方案1

修改yml配置:spring.main.allow-bean-definition-overriding=true

spring:
  main:
    allow-bean-definition-overriding: true

2.2 方案2

在每個Feign的接口中,在注解上加 contextId屬性

contextId在Feign Client的作用是在注冊Feign Client Configuration的時候需要一個名稱,名稱是通過getClientName方法獲取的

@FeignClient(name = "sale-service",contextId= "saleservice1")
 
public interface saleClient{
 
    @RequestMapping(value = "/sale/add", method = RequestMethod.GET)
 
    String add(@RequestParam("saleNum") String queryStr);
 
}

備注:contextId= "名稱" 中的名稱,不能用“_”會報錯,可以用“-”

三、源代碼分析

  • 包名:spring-cloud-openfeign-core-2.2.5.RELEASE.jar
  • 類路徑:org.springframework.cloud.openfeign.FeignClientsRegistrar

相關代碼1

 private void registerFeignClient(BeanDefinitionRegistry registry, AnnotationMetadata annotationMetadata, Map<String, Object> attributes) {
        String className = annotationMetadata.getClassName();
        BeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(FeignClientFactoryBean.class);
        this.validate(attributes);
        definition.addPropertyValue("url", this.getUrl(attributes));
        definition.addPropertyValue("path", this.getPath(attributes));
        String name = this.getName(attributes);
        definition.addPropertyValue("name", name);
        String contextId = this.getContextId(attributes);
        definition.addPropertyValue("contextId", contextId);
        definition.addPropertyValue("type", className);
        definition.addPropertyValue("decode404", attributes.get("decode404"));
        definition.addPropertyValue("fallback", attributes.get("fallback"));
        definition.addPropertyValue("fallbackFactory", attributes.get("fallbackFactory"));
        definition.setAutowireMode(2);
        String alias = contextId + "FeignClient";
        AbstractBeanDefinition beanDefinition = definition.getBeanDefinition();
        beanDefinition.setAttribute("factoryBeanObjectType", className);
        boolean primary = (Boolean)attributes.get("primary");
        beanDefinition.setPrimary(primary);
        String qualifier = this.getQualifier(attributes);
        if (StringUtils.hasText(qualifier)) {
            alias = qualifier;
        }
 
        BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, className, new String[]{alias});
        BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry);
    }

代碼截圖:

相關代碼2

可以看到, name應該是從注解中的屬性取值來的, 再看看getClientName()方法.

 private String getClientName(Map<String, Object> client) {
        if (client == null) {
            return null;
        } else {
            String value = (String)client.get("contextId");
            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;
            } else {
                throw new IllegalStateException("Either 'name' or 'value' must be provided in @" + FeignClient.class.getSimpleName());
            }
        }
    }

代碼截圖:

一目了然了, 我們聲明@FeignClient注解時, 只使用了value屬性, 所以產生了沖突, 只要加上contextId就好了.

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 提升性能秘密武器Java Unsafe類面試精講

    提升性能秘密武器Java Unsafe類面試精講

    這篇文章主要為大家介紹了提升性能秘密武器Java Unsafe類面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Spring Boot+Drools規(guī)則引擎整合詳解

    Spring Boot+Drools規(guī)則引擎整合詳解

    本篇文章主要介紹了Spring Boot+Drools規(guī)則引擎整合,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • mall整合SpringSecurity及JWT認證授權實戰(zhàn)下

    mall整合SpringSecurity及JWT認證授權實戰(zhàn)下

    這篇文章主要為大家介紹了mall整合SpringSecurity及JWT認證授權實戰(zhàn)第二篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 詳解SpringSecurity如何實現(xiàn)前后端分離

    詳解SpringSecurity如何實現(xiàn)前后端分離

    這篇文章主要為大家介紹了詳解SpringSecurity如何實現(xiàn)前后端分離,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • JAVA?OOM內存溢出問題深入解析

    JAVA?OOM內存溢出問題深入解析

    這篇文章主要為大家介紹了JAVA?OOM內存溢出問題深入解析,在生產環(huán)境搶修中,我們經常會碰到應用系統(tǒng)java內存OOM的情況,這個問題非常常見,今天我們就這個問題來深入學習探討一下
    2023-10-10
  • Java實現(xiàn)替換集合中的元素的方法詳解

    Java實現(xiàn)替換集合中的元素的方法詳解

    這篇文章主要為大家詳細介紹了Java中實現(xiàn)替換集合中的元素的常見方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-02-02
  • 一篇文章帶你入門java運算符

    一篇文章帶你入門java運算符

    這篇文章主要介紹了Java基本數(shù)據(jù)類型和運算符,結合實例形式詳細分析了java基本數(shù)據(jù)類型、數(shù)據(jù)類型轉換、算術運算符、邏輯運算符等相關原理與操作技巧,需要的朋友可以參考下
    2021-08-08
  • Java安全之Mojarra?JSF反序列化講解

    Java安全之Mojarra?JSF反序列化講解

    JSF?和類似的?Web?技術之間的區(qū)別在于?JSF?使用?ViewStates(除了會話)來存儲視圖的當前狀態(tài)(例如,當前應該顯示視圖的哪些部分),這篇文章主要介紹了Java安全之Mojarra?JSF反序列化知識講解,包括漏洞復現(xiàn)和漏洞分析,需要的朋友可以參考下
    2022-11-11
  • java1.5中訪問環(huán)境變量

    java1.5中訪問環(huán)境變量

    這篇文章主要介紹了如何在java1.5中訪問環(huán)境變量,使用System.getenv()可以訪問環(huán)境變量
    2014-01-01
  • Java實現(xiàn)排列組合算法的兩種方案

    Java實現(xiàn)排列組合算法的兩種方案

    Java排列組合算法是一種用于生成所有可能的排列和組合的算法,在Java中,可以使用遞歸或迭代的方式實現(xiàn)排列組合算法,本文給大家介紹了Java實現(xiàn)排列組合算法的兩種方案,需要的朋友可以參考下
    2024-04-04

最新評論

霍林郭勒市| 晋城| 维西| 吉木乃县| 青铜峡市| 喀什市| 凤山市| 集安市| 谷城县| 札达县| 桂阳县| 宁武县| 连城县| 米泉市| 樟树市| 乌鲁木齐市| 德庆县| 齐齐哈尔市| 乳山市| 凤冈县| 翁源县| 阿合奇县| 清流县| 钦州市| 城口县| 桐庐县| 六盘水市| 巫溪县| 三明市| 尚义县| 岗巴县| 永善县| 澄城县| 崇左市| 平和县| 天等县| 教育| 尼木县| 桂东县| 昌宁县| 东乡|