删除某个服务的数据库依赖
背景
某个服务之前是基于数据库做存储,后来改成ES做存储,需要依赖数据库的依赖
第一步: 删除yaml的数据库配置依赖
springboot启动报错 Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
第二步:修改springboot 配置类
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class
})
启动还是报错,这次报的是
Description:
Field elasticsearchTemplate in xxx required a bean named 'jdbcMappingContext' that could not be found.
Action:
Consider defining a bean named 'jdbcMappingContext' in your configuration.
根据马斯克第一义的原理,我们怀疑
问题分析
1. 错误原因
jdbcMappingContext
是 Spring Data JDBC 模块中的 Bean,用于管理实体类与数据库表的映射关系。ElasticsearchTemplate
需要该 Bean,说明项目中存在以下问题之一:- 隐式依赖了 Spring Data JDBC:项目中可能间接引入了
spring-boot-starter-data-jdbc
依赖。 - 自动配置误触发:Spring Data 的某些自动配置类(如
DataJdbcAutoConfiguration
)被错误加载,但DataSourceAutoConfiguration
已被排除,导致依赖缺失。
- 隐式依赖了 Spring Data JDBC:项目中可能间接引入了
2. 根本原因
- 依赖冲突:
spring-boot-starter-data-elasticsearch
或其他模块可能间接依赖了spring-data-jdbc
。 - 自动配置未完全排除:
DataSourceAutoConfiguration
排除后,未排除其他依赖 JDBC 的自动配置类(如DataJdbcAutoConfiguration
)。
解决方案
1. 排除 Spring Data JDBC 的自动配置
在 @SpringBootApplication
中显式排除 DataJdbcAutoConfiguration
:
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class,
DataJdbcAutoConfiguration.class // 新增此行
})
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
2. 移除不必要的依赖
检查 pom.xml
或 build.gradle
,移除 spring-boot-starter-data-jdbc
或 spring-data-jdbc
依赖:
<!-- 删除以下依赖(如果存在) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
参考资料
SpringBoot的自动装配功能
https://www.cnblogs.com/ludangxin/p/15092237.html
SpringBoot数据库配置源码解析:自动配置内部实现解析
https://cloud.tencent.com/developer/article/2143957