錯誤描述 在 Spring Cloud 項目中通過 Open Feign 遠程調用時出現如下錯誤: feign.codec.EncodeException: No qualifying bean of type 'org.springframework.boot.autoconfigure.http ...
錯誤描述
在 Spring Cloud 項目中通過 Open Feign 遠程調用時出現如下錯誤:
feign.codec.EncodeException: No qualifying bean of type 'org.springframework.boot.autoconfigure.http.HttpMessageConverters' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
...
Spring Cloud 版本:Hoxton.SR9
Spring Cloud Alibaba 版本:2.2.2.RELEASE
Spring Boot 版本:2.3.7.RELEASE
錯誤原因
從報錯信息中不難看出,錯誤原因是容器中缺少 HttpMessageConverters
這樣一個 bean 對象。
GitHub 上 spring-cloud/spring-cloud-openfeign 與此相關的 issue:https://github.com/spring-cloud/spring-cloud-openfeign/issues/235。
在 spring-boot-autoconfigure 的較新版本中(具體哪個版本我也不知道),HttpMessageConverters
的自動配置條件更改了,可以參見 HttpMessageConvertersAutoConfiguration
類:
// 這裡省去了其他無關註解
@ConditionalOnClass({HttpMessageConverter.class})
@Conditional({HttpMessageConvertersAutoConfiguration.NotReactiveWebApplicationCondition.class})
public class HttpMessageConvertersAutoConfiguration {}
因為現在的 Spring Cloud Gateway 是基於 WebFlux 的,是 Reactive Web。所以根據 @Conditional
的條件,HttpMessageConvertersAutoConfiguration
就不會生效,進而也不會進行自動配置,就導致容器中缺少 HttpMessageConverters
對象。
解決方案
這個問題解決方法也很簡單,只需自己寫一個配置類,向容器中註冊一個 HttpMessageConverters
對象即可。方法可以從 HttpMessageConvertersAutoConfiguration
中複製。參考如下:
@Configuration
public class FeignConfig {
@Bean
@ConditionalOnMissingBean
public HttpMessageConverters messageConverters(ObjectProvider<HttpMessageConverter<?>> converters) {
return new HttpMessageConverters(converters.orderedStream().collect(Collectors.toList()));
}
}
重啟項目,問題解決。
少一些功利主義的追求,多一些不為什麼的堅持