中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Spring Cloud 中@FeignClient注解中的contextId屬性是怎樣的

發布時間:2021-09-26 10:06:52 來源:億速云 閱讀:2522 作者:柒染 欄目:開發技術

今天就跟大家聊聊有關Spring Cloud 中@FeignClient注解中的contextId屬性是怎樣的,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

@FeignClient注解中的contextId屬性

在使用@FeignClient注解前,我們需要先引入其相關依賴,版本為3.0.1

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>3.0.1</version>
</dependency>

例如我們有一個user服務,user服務中有很多個接口,我們通過@FeignClient來實現接口的調用,不想將所有的調用接口都定義在一個接口類中,因此構建了下述兩個Feign接口類:

@FeignClient(name = "user-server")
public interface UserServerClient1 {
 @GetMapping("/user/get")
 public User getUser(@RequestParam("id") int id);
}
@FeignClient(name = "user-server")
public interface UserServerClient2 {
 @GetMapping("/user/getAll")
 public List<User> getAllUser();
}

這種情況下啟動項目,項目就會報錯,因為Bean的名稱沖突了,具體錯誤如下:

Description:

The bean 'user-server.FeignClientSpecification' could not be registered. A bean with that name has already been defined and overriding is disabled.


Action:

Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

解決方法一

在yml配置文件中新增下述配置,允許出現beanName一樣的BeanDefinition

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

解決方法二

為每個FeignClient手動指定不同的contextId,contextId的作用是用來區分FeignClient實例

@FeignClient(contextId = "userService1",name = "user-server")
public interface UserServerClient1 {
 @GetMapping("/user/get")
 public User getUser(@RequestParam("id") int id);
}
@FeignClient(contextId = "userService1",name = "user-server")
public interface UserServerClient2 {
 @GetMapping("/user/getAll")
 public List<User> getAllUser();
}

FeignClient注解及參數問題

在用分布式架構SpringBoot的SpringCloud技術開發過程中,@FeignClient 是一個常用的注解,且很重要的功能。它是Feign客戶端提供負載均衡的熱插拔注解,通過該注解可以動態代理創建Feign客戶端。

簡單理解就是,分布式架構服務之間,各子模塊系統內部通信的核心。

一般在一個系統調用另一個系統的接口時使用,如下:

注解

@FeignClient("XXX")
public interface XX{
   ....
}

該注解一般創建在 interface 接口中,然后在業務類@Autowired進去使用非常簡單方便。

問題背景

創建好interface接口后,當然要把調用該服務的接口方法定義出來,該方法對應本FeignClient的controller接口,必須重寫該接口方法(返回對象,參數值完全一樣)。

啟動項目出現如下報錯時,咋一看以為是在業務類中調用該接口方法時,傳參為空null而報錯。

FactoryBean threw exception on object creation; nested exception is

java.lang.IllegalStateException: RequestParam.value() was empty on parameter 0

當把傳參用數據代替時,重新啟動時;任然報如上錯誤。

貼一個報錯全截圖

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'withdrawCountRecordController': Unsatisfied dependency expressed through field 'withdrawCountService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'withdrawCountServiceImpl': Unsatisfied dependency expressed through field 'cumClient'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.epaylinks.efps.pas.clr.client.CumClient': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: RequestParam.value() was empty on parameter 0 at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)

解決辦法

在@FeignClien("XX") 接口類中,檢查每個方法的參數定義時:

是否有如下情形

@RequestMapping(value="/XXX/query", method = RequestMethod.GET)
    public PageResult<XXutionResp> query(@RequestParam(required = false) String XXCode,
                                             @RequestParam(value = "XXnName",required = false) String institutionName,
                                             @RequestParam(value = "startTime",required = false) String startTime,

問題就在這里:

@RequestParam(required = false) String XXCode

這個參數少了個value = "XXCode", 這個是Spring 4.0版本后,@RequestParam 注解對參數傳值有了很好的封裝特性并嚴格校驗。

改為:

@RequestParam(value = "XXCode", required = false) String XXCode

之后,問題完美解決;重啟項目正常。

插一句:當在項目多個地方調用同一個@FeignClien("XX")某項目時,在多個包中創建接口,并無影響。

看完上述內容,你們對Spring Cloud 中@FeignClient注解中的contextId屬性是怎樣的有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

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

AI

商丘市| 黑龙江省| 德化县| 荔波县| 大埔区| 宕昌县| 淳化县| 镇平县| 华宁县| 铁力市| 临桂县| 都匀市| 嘉义市| 凤城市| 安徽省| 资中县| 古蔺县| 昌邑市| 兴仁县| 资阳市| 南召县| 峡江县| 慈利县| 吉安市| 东丰县| 河北区| 凤庆县| 邹平县| 孟村| 临清市| 游戏| 信宜市| 崇文区| 民和| 华坪县| 隆昌县| 托克托县| 桓台县| 昭通市| 西宁市| 大田县|