解决springboot项目启动报错Field xxxMapper in com...xxxController required
作者:Stephen·You
问题现象
今天在启动项目的时候发现了一个报错,如下:
Field xxxMapper in com...xxxController required a bean of type ‘com...xxxMapper‘
问题分析
根据报错信息可以知道:
错误原因是:xxxMapper不存在与Spring容器中'';
所以现在的问题就是把xxxMapper加入到bean容器中即可.
首先查看Controller层,查看是否有以下代码:
@Autowired private JkMessageMapper jkMessageMapper;
上面的代码,就是用于在实现了JkMessageMapper注入到bean容器后,可以自动创建该类对象,并交由bean容器管理;
通过查看xxxMapper接口,可以发现问题:
因为Mapper接口类没有添加注解,导致spring容器并没有处理到这个接口类。
注意:
我的项目中是没有dao层实现类的,因为添加@Mapper注解后,spring会自动将dao层实现类创建并注入bean容器中;
总结:
- 如果用到了Controller(控制层),需要在Controller类上添加@Controller注解;
- 如果用到了Service(业务层)的话,需要在Service接口类上添加@Service注解;
- 如果用到了ServiceImpl(业务层实现类),则需要在实现类上添加@Component注解;
- 如果用到了MapperImpl/DaoImpl(dao层实现类),则需要在实现类上添加@Repository注解,但如果在dao层接口类上添加了@Mapper注解的话,其实可以不需要dao层实现类了。
解决方法
由于我这里只是忘记添加@Mapper注解了,其他配置都没有问题,所以只需要
在Mapper接口类(dao层)上添加@Mapper注解:
启动成功:
拓展
从上门的分析可知,文章中提到的报错是因为bean对象注入失败导致的,那下面再说一下其他可能会导致该报错的原因:
1、dao层xml文件(mybatis映射文件)中 namespace属性配置的路径和关联的dao层(接口类)文件的所在目录路径不一致。
(提示:在IDEA默认情况下,选择一个dao层xml文件(mybatis映射文件),可以通过按住ctrl键再点击映射的dao层(接口类)快速定位到所映射的dao层类,如果定位不到,则配置的路径有问题)。
2、没有设置dao层包路径识别注解(@MapperScan(dao层所在的包路径))
@MapperScan 注解可以加在数据源配置类上,或者是启动类上都可以。
作用是让spring容器在初始化时,去加载该注解所配置的包路径下的所有dao层类,生成对应的bean对象。
3、没有设置dao层xml文件(mybatis映射文件)的路径。
假如项目中有数据源配置类,那最好是配置一下dao层xml文件的路径:
而如果没有数据源配置类,则需要在项目的 application配置文件中配置dao层xml文件的路径:
mybatis配置:
mybatis-plus配置:
当然还有第3种配置方法,就是通过mybatis-config.xml配置文件也可以:
然后还需要在application配置文件中添加mybatis配置文件的路径:
强烈建议不要第3种方式,来配置dao层xml文件的路径,因为你需要一个个去添加dao层xml文件(mybatis映射文件)的路径到mybatis-config.xml文件中的mappers标签中,太过麻烦和繁琐了!
初始化 SqlSessionFactory 数据源工厂对象的时候,加载该路径,作用是在创建dao层类的bean对象时,能提供一个实例对象以供初始化:
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
- 解读@NoArgsConstructor,@AllArgsConstructor,@RequiredArgsConstructor的区别及在springboot常用地方
- SpringBoot启动失败的解决方法:A component required a bean of type ‘xxxxxxx‘ that could not be found.
- SpringBoot3整合MyBatis出现异常:Property 'sqlSessionFactory'or 'sqlSessionTemplate' are required
- springboot @RequiredArgsConstructor的概念与使用方式