a commponent required a bean of type XXXXXX that could not be found

一、问题由来

  目前刚入职一家新公司不久,公司的新项目采用DDD驱动领域设计来进行开发,架构这一块使用的是阿里巴巴开源的最新框架COLA4.0的架构。

主要是这个框架里面的分层设计。主要分为四层:adapter适配层类似于以前的Controller层;app层类似于以前的Service层;domain层是领域层;还有

一个infrastructure层表示基础设施服务层,提供基础服务,比如数据库服务。项目还是进行设计阶段,自己主要负责开发这一块。由于大家都是刚开始

接触DDD这个新知识,因此还有很多东西都需要学习。由于我们负责的这个项目属于通用域,而且人手也不是太多,因此很多东西都需要亲力亲为。

比如说搭建项目框架,基础架构采用cola4.0,里面具体使用什么版本的SpringBoot,SpringCloud,Redis,Postgresql等等,都得我们自己来定。自己

也没闲着,立马去学习Cola4.0这个框架,由于这种设计理念很是新颖,因此在网上可供参考学习的资料很少。不像什么SpringBoot,springCloud之类的

课程,一搜就一堆的答案。Cola4.0的框架的大致架构如图所示:

详细的错误信息如下:

a component required a bean of type xxxxxx that could not be found
Action
Consider defining a bean of type xxxxxx in your configuration

二、问题分析

  从错误信息来看,大致意思就是组件找不到类型为xxxxxx的bean,可以考虑在配置中定义一个bean。自己根据实际情况来判断报错的类型是一个接口,

这个接口有具体的实现类,实现类中使用的注解为@Component.这个接口有在其他地方被使用,启动项目时由于这个类没有被加载到,因此报这个错。能

确定一点就是接口的实现类没有被加载到,可是为什么没有被加载到呢?框架是我们按照cola4.0的架构自己来搭建的,它里面就是一些简单的骨架,没有

具体封装一些代码之类的,我们用的话也只会考虑使用它的架构。这就很让人疑惑,使用原作者的框架就可以正常运行,怎么自己来搭建就不行了呢?

三、解决方案

      拿到这个错误信息,自己立马开始使用搜索引擎。由于这个项目比较特殊,启动类是单独为一个start项目,主要作用就是用来启动

项目,不做其他任何事情。

尝试方案一:

推测接口实现类中没有添加对应的注解,所以不能被扫描到。

自己经过检查,发现所有的接口实现类都添加了@Component注解。会不会有这种可能,这个注解不生效?

于是自己换成@Service注解,重新启动项目,发现问题任然未解决。

参考文章 https://blog.csdn.net/qq_39691492/article/details/118085232

 

尝试方案二:

推测导致这个错误的原因可能是由于接口的实现类没有被扫描到,没有正确加载到spring容器中,最终出现问题。

使用@ComponentScan包扫描注解,把接口实现类的包路径放进去,然后重新启动项目。结果为解决。

参考文章 https://blog.csdn.net/suxiexingchen/article/details/84984349

 

尝试方案三:

推测可能是包结构不对导致来加载错误。这到是有可能,然后自己仔细检查了项目的包结构,排除此问题,包结构

没有问题,还是没有解决。

https://blog.csdn.net/Julycaka/article/details/80622754

 

这时候自己就开始分析,说先确定一点接口的实现类没有被加载到spring容器中,为什么会没有被加载到呢?然后自己

倒回去看看cola4.0的例子,查看模块之间的相互引用关系,这时发现问题了。demo例子中app层直接引用了infrastructure,

我们自己搭建的框架中没有做这个引用,这就导致infrastructure层中的代码没有被正确扫描到,继而不能被加载到spring容器中。

自己立马去app层中添加该模块,然后重新启动项目,发现启动成功,问题解决。

 

总结:使用maven进行多模块开发的时候,需要确保所有的模块中的包路径都能被扫描到,否则就会导致类加载不了的问题。

不管是直接引用还是间接引用,只有所有的模块都和启动类关联起来后,项目才能够正常启动。我们的项目中引用关系如下:

start层 引用 adapter层;

adapter层 引用 app层; 

app层 引用 domain层;app层 引用 infrastructure层;

infrastructure层 引用 domain层; 

common层被除start层外的所有模块引用;

这样虽然项目启动层start中只有一个启动类,通过这种直接的或者是间接的引用关系就可以加载所有的bean对象。

商匡云商
Logo
对比商品
  • 合计 (0)
对比
0
购物车