• openfeign异常--NoSuchBeanDefinitionException: No qualifying bean of type



    1、完整报错


    2022-06-29 16:17:28.127  WARN 3732 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context 
    initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: 
    
    Error creating bean with name 'sysLogAspect': Unsatisfied dependency expressed through field 'remoteSysLogService';
     nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean 
     of type 'cn.ycl.system.api.syslog.feign.RemoteSysLogService' available: expected at least 1 bean which qualifies as autowire candidate.
      Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
      
    2022-06-29 16:17:28.154  INFO 3732 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
    2022-06-29 16:17:28.167  INFO 3732 --- [           main] ConditionEvaluationReportLoggingListener : 
    
    Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
    2022-06-29 16:17:28.189 ERROR 3732 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 
    
    ***************************
    APPLICATION FAILED TO START
    ***************************
    
    Description:
    
    Field remoteSysLogService in cn.ycl.syslog.SysLogAspect required a bean of type 'cn.ycl.system.api.syslog.feign.RemoteSysLogService' that could not be found.
    
    The injection point has the following annotations:
    	- @org.springframework.beans.factory.annotation.Autowired(required=true)
    
    
    Action:
    
    Consider defining a bean of type 'cn.ycl.system.api.syslog.feign.RemoteSysLogService' in your configuration.
    
    Disconnected from the target VM, address: '127.0.0.1:63200', transport: 'socket'
    
    Process finished with exit code 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    可以看到异常提示是:NoSuchBeanDefinitionException,报这种错一般就是Spring注入bean实例失败了。

    2、我的最终解决方式


    在启动类的@EnableFeignClients后面加上包扫描路径,如下:

    在这里插入图片描述


    3、为什么那么久才找到解决办法


    如果只有一个启动类中存在@EnableFeignClients注解,那么不需要加basepackage也不会报错并启动成功;

    但是一旦有了两个或以上的业务模块作为feign客户端,也就是有两个以上的启动类上存在@EnableFeignClients注解,不加basepackage将报如上错误。


    4、没有集成feign时,报此错的解决办法


    前面说了,报这种错一般就是Spring注入bean实例失败,所以要么是包扫描路径的问题,比如我遇到的这个问题,以及经典的启动类上没有配置mapper包扫描路径,导致报错XxxMapper类找不到,或者XxxDao类找不到:
    在这里插入图片描述

    要么就是报错的bean上面没有加注解,比如@Service、@Component、@Mapper、@Repository、@Configuration、@RestController等。

    看过SpringBoot启动类源码的都知道,Spring boot只会将两种类注入bean容器中:

    第一种:要么是在Resource/META-INF/spring.factories文件夹下手动配置的类;
    第二种:要么是在启动类所属包下,且被@Component或其派生注解修饰的类(上面提到的注解都是@Component的派生注解)

    才会被注入bean容器中。

    在这里插入图片描述

    5、集成了openfeign时的其他可能原因

    1、feign接口是否定义了实现类,最好添加实现类

    2、feign接口实现类上方是否加了@Service注解

    3、一般定义feign接口的模块都是没有启动类的模块,若想要在其他模块调用此模块中的feign接口,是否在Resource/META-INF/spring.factories中手动配置了feign接口的实现类

    6、补充

    feign接口写法示例:

    /**
     * @author yuanchangliang
     * @date 2022-06-20 15:08
     **/
    @FeignClient(contextId = "remoteUserService", value = "ycl-auth",fallbackFactory = RemoteUserServiceFallback.class)
    public interface RemoteUserService {
        /**
         * 获取订单
         *
         * @return 请求结果
         */
         @RequestMapping(value = "/restapi/user/getUserInfo", method = RequestMethod.GET)
         UserInfoVO getUserInfo();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    feign接口实现类写法示例:

    /**
     * @author yuanchangliang
     * @date 2022-06-21 09:30
     **/
    @Service
    public class RemoteUserServiceFallback implements FallbackFactory<RemoteUserService> {
        private static final Logger log = LoggerFactory.getLogger(RemoteUserServiceFallback.class);
    
        @Override
        public RemoteUserService create(Throwable cause) {
            log.info("调用用户接口失败:{}" + cause.getMessage());
            return new RemoteUserService() {
                @Override
                public UserInfoVO getUserInfo() {
                    return null;
                }
          };
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    spring.factories写法示例:

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
      cn.ycl.auth.api.user.feign.RemoteUserServiceFallback
    
    • 1
    • 2

    7、总结

    细心、细心、还是细心!!!

  • 相关阅读:
    中外联合培养工商管理博士|社科大新加坡社科大学中文授课DBA
    Redis未授权访问漏洞复现
    java 可变个数形参
    Clickhouse表引擎介绍
    每天一道算法题(三)——获取数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
    两字符串拼接形成回文串
    无人驾驶与人工驾驶的对比,人工驾驶的优缺点
    C++深度优先搜索(DFS)算法的应用:树中可以形成回文的路径数
    SRIO系列-基本概念及IP核使用
    限时开源,来自大佬汇总的Kafka限量笔记,绝对不会后悔!
  • 原文地址:https://blog.csdn.net/yuanchangliang/article/details/125524522