91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

@FeignClient注解中的contextId屬性如何使用

發布時間:2022-06-18 13:41:26 來源:億速云 閱讀:1288 作者:iii 欄目:開發技術

這篇文章主要介紹“@FeignClient注解中的contextId屬性如何使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“@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);
    }

代碼截圖:

@FeignClient注解中的contextId屬性如何使用

相關代碼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注解中的contextId屬性如何使用

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

關于“@FeignClient注解中的contextId屬性如何使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

贵溪市| 都匀市| 黄石市| 滨州市| 兴文县| 海安县| 敖汉旗| 惠水县| 牡丹江市| 安宁市| 辛集市| 资中县| 怀来县| 奉新县| 英山县| 岳池县| 平罗县| 黄平县| 德阳市| 南丹县| 老河口市| 安仁县| 双鸭山市| 隆尧县| 昭苏县| 共和县| 龙里县| 洞头县| 密山市| 瑞丽市| 龙游县| 正宁县| 鹰潭市| 乌什县| 封丘县| 杂多县| 嘉定区| 金沙县| 德惠市| 兴业县| 亚东县|