1. 程式人生 > >FeignClient註解及引數問題---SpringCloud微服務

FeignClient註解及引數問題---SpringCloud微服務

一、前言

在用分散式架構SpringBoot的SpringCloud技術開發過程中,FeignClient 是一個常用的註解,且很重要的功能。

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

一般在一個系統呼叫另一個系統的介面時使用,如下:

註解

@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")某專案時,在多個包中建立介面,並無影響。

 

關注個人技術公眾號:nick_coding1024

不定期分享最新前沿技術框架和bat大廠常用技術等,加群不定期分享行業內大牛直播講課以及獲得內退一線網際網路公司機會。