创建Azure SQL数据库及表时遇EmployeeRepository Bean找不到错误求助
问题场景
尝试基于Spring Boot连接Microsoft Azure SQL数据库并通过JPA自动生成表,启动程序后出现依赖注入错误,提示无法找到EmployeeRepository类型的Bean。
相关代码片段
Employee实体类
package com.javatechie.azuresql; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.stereotype.Component; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table @Data @AllArgsConstructor @NoArgsConstructor @Component public class Employee { @Id @GeneratedValue private int id; private String name; private String dept; private long salary; }
EmployeeRepository接口
package com.javatechie.azuresql; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Component; @Component public interface EmployeeRepository extends JpaRepository<Employee,Integer> { }
SpringbootAzuresqlApplication主类
package com.javatechie.azuresql; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import java.util.List; @SpringBootApplication @RestController public class SpringbootAzuresqlApplication { @Autowired private EmployeeRepository repository; @PostMapping("/employee") public Employee addEmployee(@RequestBody Employee employee){ return repository.save(employee); } @GetMapping("/employees") public List<Employee> getEmployees(){ return repository.findAll(); } public static void main(String[] args) { SpringApplication.run(SpringbootAzuresqlApplication.class, args); } }
application.yml配置
spring: datasource: url: jdbc:jdbc:sqlserver://javatechi.database.windows.net:1433;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30; username: javatechi password: password.123 jpa: show-sql: true hibernate: ddl-auto: update dialect: org.hibernate.dialect.SQLServer2012Dialect server: port: 9191
pom.xml依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.javatechie</groupId> <artifactId>springboot-azuresql</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot-azure-sql</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>org.webjars.npm</groupId> <artifactId>table</artifactId> <version>5.4.6</version> </dependency> <dependency> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> <version>1.0.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
错误信息
描述:
com.javatechie.azuresql.SpringbootAzuresqlApplication中的repository字段需要一个类型为'com.javatechie.azuresql.EmployeeRepository'的Bean,但无法找到。注入点带有以下注解:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
建议:
考虑在配置中定义一个类型为'com.javatechie.azuresql.EmployeeRepository'的Bean。
解决步骤
1. 修正Repository的注解
将EmployeeRepository上的@Component替换为@Repository,Spring Data JPA需要通过该注解识别仓库接口,并动态生成代理实现类:
package com.javatechie.azuresql; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface EmployeeRepository extends JpaRepository<Employee,Integer> { }
2. 移除实体类的冗余注解
实体类不需要被Spring容器管理,删除Employee类上的@Component注解:
package com.javatechie.azuresql; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table @Data @AllArgsConstructor @NoArgsConstructor public class Employee { @Id @GeneratedValue private int id; private String name; private String dept; private long salary; }
3. 优化pom.xml依赖
使用Spring Boot官方的spring-boot-starter-data-jpa替代单独的spring-data-jpa,starter会自动管理版本和依赖,同时移除不必要的persistence-api和table依赖:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <scope>runtime</scope> </dependency> <!-- 替换为Spring Boot JPA Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> </dependencies>
4. 修复数据库URL错误
原URL中重复了jdbc:前缀,修正为正确的格式:
spring: datasource: url: jdbc:sqlserver://javatechi.database.windows.net:1433;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30; username: javatechi password: password.123 jpa: show-sql: true hibernate: ddl-auto: update dialect: org.hibernate.dialect.SQLServer2012Dialect server: port: 9191
5. 确认包扫描范围
主类SpringbootAzuresqlApplication所在包为com.javatechie.azuresql,Repository和实体类都在同一包下,@SpringBootApplication默认会扫描当前包及子包,无需额外添加@ComponentScan(若有需要可保留,但当前场景下冗余)。
完成以上修改后,重新启动应用,Spring会正确生成EmployeeRepository的Bean,并通过JPA连接Azure SQL自动生成表结构。
内容的提问来源于stack exchange,提问作者tricks. com

