Spring应用缓存未命中时抛出feign.Client类型Bean不存在异常
问题分析与解决方案
问题核心
缓存未命中时调用Feign客户端抛出org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'feign.Client' available,结合堆栈信息来看,是Spring Cloud Sleuth的LazyClient在尝试获取真实的Feign Client实现时找不到对应的Bean。
可能原因
- Sleuth延迟加载与缓存代理的冲突:Sleuth为Feign生成的
LazyClient会延迟获取真实Client实例,但缓存切面(CGLIB代理)的上下文切换导致Bean获取时机异常,只有缓存未命中触发实际Feign调用时才暴露问题。 - Feign Client Bean未自动初始化:虽然引入了
spring-cloud-starter-openfeign,但可能因Sleuth自动配置顺序、自定义Feign配置覆盖等原因,默认的Feign Client Bean未被Spring容器创建。
解决方案
方案1:显式声明Feign Client Bean
直接在配置类中定义feign.Client实现,让Spring容器明确管理该Bean,避免LazyClient找不到实例:
import feign.Client; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FeignConfig { @Bean public Client feignClient() { // 使用Feign默认Client实现 return new Client.Default(null, null); // 若用OkHttp/HttpClient,先引入对应依赖再替换: // return new OkHttpClient(); // return new ApacheHttpClient(); } }
方案2:确认Sleuth Feign instrumentation启用
在application.yml中明确开启Sleuth对Feign的支持,确保自动配置生效:
spring: cloud: sleuth: feign: enabled: true
方案3:调整代理嵌套逻辑
如果@Cacheable方法与Feign调用在同一个类中,CGLIB代理可能导致内部调用无法正确触发Feign代理逻辑。可将Feign调用抽离为单独Bean,确保注入的Feign客户端是完整代理实例:
// 单独的Feign调用服务类 @Service public class FeignCallService { private final PricingClient pricingClient; public FeignCallService(PricingClient pricingClient) { this.pricingClient = pricingClient; } public ResponseEntity<String> callPricingService(String token, PricingRequest request) { return pricingClient.postRule(token, request); } } // 原缓存服务类 @Service public class CustomPricingService { private final FeignCallService feignCallService; public CustomPricingService(FeignCallService feignCallService) { this.feignCallService = feignCallService; } @Cacheable(cacheNames = "pricingRules") public String getCustomRule(String token, PricingRequest request) { ResponseEntity<String> response = feignCallService.callPricingService(token, request); return response.getBody(); } }
方案4:排查依赖与配置冲突
- 检查依赖树,确认
feign-core、spring-cloud-starter-sleuth与spring-cloud-starter-openfeign版本兼容(你的Spring Cloud 2021.0.5与Spring Boot 2.7.5版本匹配)。 - 检查是否存在自定义Feign配置类,是否覆盖默认Client配置导致Bean未生成。
内容的提问来源于stack exchange,提问作者EduwHS
相关产品推荐
相关产品推荐

