SpringBoot注入JdbcTemplate提示无对应类型Bean如何解决
问题现象
SpringBoot项目中使用构造器注入JdbcTemplate时,IDE中该参数被红色下划线标注,错误提示:
Could not autowire. No beans of 'JdbcTemplate' type found
无运行时堆栈报错,仅IDE提示。
对应Repository代码:
package projet.thesquad.repository; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import projet.thesquad.domain.Member; @Repository public class MemberRepository { private final String ADD_MEMBER_REQUEST = "INSERT INTO TheSquad.Member (fistname, lastname, job) VALUES (?, ?, ?)"; private final JdbcTemplate jdbcTemplate; public MemberRepository(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public int addMember(Member member) { return jdbcTemplate.update(ADD_MEMBER_REQUEST, member.getFirstname(), member.getLastname(), member.getJob()); } }
对应build.gradle依赖配置:
dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jdbc' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework:spring-core:5.3.21' implementation 'org.springframework:spring-jdbc:5.3.21' runtimeOnly 'mysql:mysql-connector-java' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' }
解决方法
分两种场景处理:
- 场景1:仅IDE标红,项目实际可正常启动运行
这是IDE的Spring上下文索引异常导致的误报,无需修改业务代码,按以下步骤操作即可:- 确认IDE已开启注解处理器
- 清理IDE缓存并重启:执行
File -> Invalidate Caches... -> Invalidate and Restart - 重新刷新Gradle依赖,等待IDE完成项目索引重建后,红线提示会自动消失
- 场景2:IDE标红同时项目启动也抛出找不到JdbcTemplate类型bean的错误
这是配置问题导致的自动装配失效,按以下步骤修复:- 删除build.gradle中手动指定版本的spring-core、spring-jdbc依赖。
spring-boot-starter-data-jdbc已经会引入和当前SpringBoot版本完全适配的spring-jdbc、spring-core依赖,手动指定固定版本很容易出现版本不兼容、自动配置类不生效的问题,直接删除这两行:implementation 'org.springframework:spring-core:5.3.21' implementation 'org.springframework:spring-jdbc:5.3.21' - 检查项目配置文件(application.yml/application.properties)中的数据源配置是否完整。JdbcTemplate自动装配的前提是容器中存在配置正确的DataSource bean,必填配置参考(application.yml格式):
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/你的数据库名?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: 数据库账号 password: 数据库密码 - 如果完成以上两步后仍报错,可以手动在配置类中注册JdbcTemplate的Bean:
@Configuration public class JdbcConfig { @Bean public JdbcTemplate jdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } }
- 删除build.gradle中手动指定版本的spring-core、spring-jdbc依赖。
额外注意:你代码中的插入SQL存在拼写错误,字段名写的是fistname,和传入参数对应的firstname不一致,后续运行时会抛出字段不存在的SQL异常,记得同步修正。
内容的提问来源于stack exchange,提问作者Yaanakis
相关产品推荐
相关产品推荐

