> 技术文档 > 【沉浸式解决问题】Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required_property \'sqlsessionfactory\' or \'sqlsessiontemplat

【沉浸式解决问题】Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required_property \'sqlsessionfactory\' or \'sqlsessiontemplat


目录

  • 一、问题描述
  • 二、场景还原
    • 1. 测试mapper
    • 2. 测试service
  • 三、原因分析
  • 四、解决方案
    • 1. DemoApplicationTests
    • 2. DemoApplication
  • 后记

一、问题描述

在Application文件中加了@ComponentScan注解,此后运行任何测试方法均报错

java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: java.lang.IllegalArgumentException: Property ‘sqlSessionFactory’ or ‘sqlSessionTemplate’ are required

【沉浸式解决问题】Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required_property \'sqlsessionfactory\' or \'sqlsessiontemplat
【沉浸式解决问题】Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required_property \'sqlsessionfactory\' or \'sqlsessiontemplat
意思就是缺少\'sqlSessionFactory\' 或者 \'sqlSessionTemplate\',导致\'testMapper\'创建失败,导致\'testServiceImpl\'创建失败,最后导致ApplicationContextspring的上下文创建失败


二、场景还原

先看下整体目录
【沉浸式解决问题】Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required_property \'sqlsessionfactory\' or \'sqlsessiontemplat

1. 测试mapper

最开始是测试MybatisPlus的BaseMapper中的方法

 @Autowired UserMapper userMapper; @Test void test1() { List<User> userList = new ArrayList<>(); userMapper.insert(userList); }

但是报错找不到UserMapper的bean,感觉不对劲,因为mapper文件上都加了@Mapper的注解
【沉浸式解决问题】Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required_property \'sqlsessionfactory\' or \'sqlsessiontemplat
查了一下,然后在Application上加了mapper扫描路径注解,问题算是解决了

@SpringBootApplication@MapperScan(\"com.baomidou.mapper\")public class DemoApplication {}

2. 测试service

接下来测试MybatisPlus的IService中的方法

 @Autowired IUserService userService; @Test void test4() { List<User> userList = new ArrayList<>(); for (int i = 0; i < 5; i++) { User user = new User(); user.setName(\"姓名\"+i); userList.add(user); } userService.saveBatch(userList,2); }

继续报错找不到IUserService的bean
【沉浸式解决问题】Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required_property \'sqlsessionfactory\' or \'sqlsessiontemplat
再次百度,说是再加上扫描路径,感觉有道理
【沉浸式解决问题】Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required_property \'sqlsessionfactory\' or \'sqlsessiontemplat
加完以后如下

@SpringBootApplication@MapperScan(\"com.baomidou.mapper\")@ComponentScan(basePackages = \"com.baomidou\")public class DemoApplication {}

这下坏了,再运行就报问题描述中的错误
【沉浸式解决问题】Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required_property \'sqlsessionfactory\' or \'sqlsessiontemplat
有查到说显示注入一下的,创建了一个AbstractDao仍然没用
【沉浸式解决问题】Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required_property \'sqlsessionfactory\' or \'sqlsessiontemplat


三、原因分析

后续进行控制变量测试,重写创建一个测试类,注释一些代码,最终发现核心问题就是加了@ComponentScan(basePackages = \"com.baomidou\")这句话,导致spring上下文创建失败,可能是导致默认路径冲突了,最基础的bean也无法生成。
当然,以上只是表象,根本原因是测试类和启动类都在com.example.demo包下,而所有的实体类等文件都在com.baomidou目录下,所以启动错误了
【沉浸式解决问题】Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required_property \'sqlsessionfactory\' or \'sqlsessiontemplat


四、解决方案

为了改动最小,可以把DemoApplication启动类复制到com.baomidou目录下一份,如上图,再把这个删除,然后在测试类中设置启动类,修改结果如下
【沉浸式解决问题】Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required_property \'sqlsessionfactory\' or \'sqlsessiontemplat

1. DemoApplicationTests

import com.baomidou.DemoApplication;@SpringBootTest(classes = DemoApplication.class)class DemoApplicationTests {}

2. DemoApplication

@MapperScan还是不能去掉

@SpringBootApplication@MapperScan(\"com.baomidou.mapper\")public class DemoApplication {}

后记

原因很无聊,但是排查的过程很麻烦,大家以后都要细心一点><


喜欢的点个关注吧><!祝你永无bug!

/*  _ooOoo_  o8888888o  88\" . \"88  (| -_- |)  O\\ = /O  ____/`---\'\\____ .\' \\\\| |// `. / \\\\||| : |||// \\  / _||||| -:- |||||- \\  | | \\\\\\ - /// | |  | \\_| \'\'\\---/\'\' | |  \\ .-\\__ `-` ___/-. / ___`. .\' /--.--\\ `. . __ .\"\" \'< `.___\\__/___.\' >\'\"\". | | : `- \\`.;`\\ _ /`;.`/ - ` : | | \\ \\ `-. \\_ __\\ /__ _/ .-` / /======`-.____`-.___\\_____/___.-`____.-\'======  `=---=\'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 佛祖保佑 永无BUG*/