【沉浸式解决问题】Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required

目录

一、问题描述

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

java.lang.IllegalStateException: Failed to load ApplicationContext

Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required


意思就是缺少'sqlSessionFactory' 或者 'sqlSessionTemplate',导致'testMapper'创建失败,导致'testServiceImpl'创建失败,最后导致ApplicationContextspring的上下文创建失败


二、场景还原

先看下整体目录

1. 测试mapper

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

java 复制代码
    @Autowired
    UserMapper userMapper;

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

但是报错找不到UserMapper的bean,感觉不对劲,因为mapper文件上都加了@Mapper的注解

查了一下,然后在Application上加了mapper扫描路径注解,问题算是解决了

java 复制代码
@SpringBootApplication
@MapperScan("com.baomidou.mapper")
public class DemoApplication {
}

2. 测试service

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

java 复制代码
    @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

再次百度,说是再加上扫描路径,感觉有道理

加完以后如下

java 复制代码
@SpringBootApplication
@MapperScan("com.baomidou.mapper")
@ComponentScan(basePackages = "com.baomidou")
public class DemoApplication {
}

这下坏了,再运行就报问题描述中的错误

有查到说显示注入一下的,创建了一个AbstractDao仍然没用


三、原因分析

后续进行控制变量测试,重写创建一个测试类,注释一些代码,最终发现核心问题就是加了@ComponentScan(basePackages = "com.baomidou")这句话,导致spring上下文创建失败,可能是导致默认路径冲突了,最基础的bean也无法生成。

当然,以上只是表象,根本原因是测试类和启动类都在com.example.demo包下,而所有的实体类等文件都在com.baomidou目录下,所以启动错误了


四、解决方案

为了改动最小,可以把DemoApplication启动类复制到com.baomidou目录下一份,如上图,再把这个删除,然后在测试类中设置启动类,修改结果如下

1. DemoApplicationTests

java 复制代码
import com.baomidou.DemoApplication;

@SpringBootTest(classes = DemoApplication.class)
class DemoApplicationTests {
}

2. DemoApplication

@MapperScan还是不能去掉

java 复制代码
@SpringBootApplication
@MapperScan("com.baomidou.mapper")
public class DemoApplication {
}

后记

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


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

txt 复制代码
/*
                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\  =  /O
               ____/`---'\____
             .'  \\|     |//  `.
            /  \\|||  :  |||//  \
           /  _||||| -:- |||||-  \
           |   | \\\  -  /// |   |
           | \_|  ''\---/''  |   |
           \  .-\__  `-`  ___/-. /
         ___`. .'  /--.--\  `. . __
      ."" '<  `.___\_<|>_/___.'  >'"".
     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
     \  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======
                   `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            佛祖保佑       永无BUG
*/
相关推荐
计算机毕设定制辅导-无忧学长9 小时前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统
小郎君65815 小时前
注解式脱敏:用 Jackson 的 ContextualSerializer 做字段级策略(一)
spring boot·spring cloud
jktantan18 小时前
注解式脱敏:用 Jackson 的 ContextualSerializer 做字段级策略(一)
spring boot·后端·算法·spring cloud·系统架构
露天赏雪1 天前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel
蜗牛8752 天前
为 Spring Boot 团队做一个 Elasticsearch 查询工作台:六种模式、语义补全与浏览器直连
spring boot
养军博客2 天前
Spring Boot 3.x + Spring Security 6.x 整合 JWT 实战:jjwt 与 java-jwt 两种工具库详解
java·spring boot·springsecurity
txxzjmzlh2 天前
SpringBoot 统⼀功能处理
java·spring boot·后端
秋天的怀念_David2 天前
算法一千零一夜 · 第二十六夜 协议的母语
java·spring boot·算法
余槐i3 天前
MySQL 8.0 联合索引走错:为什么加了索引查询反而从 200ms 变成 8s
java·spring boot·mysql·docker·性能优化
nice_lcj5203 天前
【从零理解 Spring AI · 03】Spring AI 在 Spring 生态里的位置
java·spring boot·大模型·spring ai·ai应用开发