博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
No fallback instance of type class found for feign client user-service(转)
阅读量:6245 次
发布时间:2019-06-22

本文共 2793 字,大约阅读时间需要 9 分钟。

1、错误日志

在 feign 开启熔断,配置 fallback 类,实现当前接口的实现类时,报错信息如下:

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.ERROR 7204 --- [ main] o.s.boot.SpringApplication  : Application run failedorg.springframework.beans.factory.UnsatisfiedDependencyException:   Error creating bean with name 'consumerController': Unsatisfied dependency expressed through field 'mUserClient'; nested exception is org.springframework.beans.factory.BeanCreationException:   Error creating bean with name 'club.sscai.consumer.client.UserClient': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException:   No fallback instance of type class club.sscai.consumer.client.UserClientImpl found for feign client user-service

 

2、通常配置

1、开启 hystrix(默认是关闭的):feign.hystrix.enabled=true2、Fallback 接口实现类需要注解 @Component

如果到此处还没有解决的话?请往下看。

 

3、转载解决方案

跟踪代码发现 是因为对FeignClient 这个接口做了AOP切面。

@Pointcut("execution(* com.xx.xx.service.IR*.*(..))")public void remoteCall() {}

Trace日志看到这么一行:

[DEBUG] [17:50:22.410][JdkDynamicAopProxy][117]: Creating JDK dynamic proxy: target source is SingletonTargetSource for target object [com.xx.xx.service.HystrixClientFallback@32354b00]

然后考虑是不是因为Spring AOP动态代理默认为 JDK动态代理。

切面还是要切的,Fallback也不能放弃。因为调用的是接口,无论如何都要被切。

换成cglib后,问题成功解决。


 

原理

SpringAOP 的动态代理有两种实现,JDK动态代理,和Cglib。
Spring默认使用 JDK动态代理。
当类至少实现了一个接口时,使用JDK动态代理。上文的Feign的Fallback类正好是这样。
至于究竟为什么cglib可以成功,就不去深究了,方案就两个,非此即彼。
至于为什么 找不到 fallback instance?

private String[] doGetBeanNamesForType(ResolvableType type, boolean includeNonSingletons, boolean allowEagerInit) {    List
result = new ArrayList
(); // Check all bean definitions. for (String beanName : this.beanDefinitionNames) { // Only consider bean as eligible if the bean name // is not defined as alias for some other bean. if (!isAlias(beanName)) { try { RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName); // Only check bean definition if it is complete. if (!mbd.isAbstract() && (allowEagerInit || ((mbd.hasBeanClass() || !mbd.isLazyInit() || isAllowEagerClassLoading())) && !requiresEagerInitForType(mbd.getFactoryBeanName()))) { // In case of FactoryBean, match object created by FactoryBean. boolean isFactoryBean = isFactoryBean(beanName, mbd); boolean matchFound = (allowEagerInit || !isFactoryBean || containsSingleton(beanName)) && (includeNonSingletons || isSingleton(beanName)) && isTypeMatch(beanName, type);......

问题出现在isTypeMatch

这里isTypeMatch 返回了false,因为骗不过JVM类型检查。当使用cglib则是匹配的。

 

原文地址:

 

转载于:https://www.cnblogs.com/niceyoo/p/10051907.html

你可能感兴趣的文章
我的友情链接
查看>>
javascript变量的作用域
查看>>
CakePHP 2.x CookBook 中文版 第七章 模型 之 保存数据(二)
查看>>
第8章 三路由不同网段互通实验(中级篇)
查看>>
【啊哈!算法】最快最简单的排序——桶排序
查看>>
运城数据恢复注册了一个网站
查看>>
shell脚本菜
查看>>
ubuntu jdk安装配置
查看>>
分布式系统若干经验总结
查看>>
使用JSONP解决跨域问题-代码示例
查看>>
golang Tag
查看>>
云端时代桌面云架构介绍(CTVI)
查看>>
iptables之实例
查看>>
第三周作业
查看>>
VTDecoderXPCService意外退出
查看>>
js 数字验证
查看>>
在repeater中实现radiobutton单选
查看>>
使用Ora2Pg工具把数据从Oracle导入到PostgreSQL
查看>>
条件注释判断浏览器
查看>>
页面自动刷新代码大全
查看>>