Spring Boot中Autowired注解依赖注入异常问题求助
错误信息
org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为'myAppHomeController'的Bean时出错:通过字段'myAppUserRepository'表达的依赖不满足;嵌套异常为org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到类型为'com.myapp.repository.MyAppUsersListRepository'的合格Bean:期望至少有1个符合自动装配候选条件的Bean。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)}]
根因:
org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到类型为'com.myapp.repository.MyAppUsersListRepository'的合格Bean:期望至少有1个符合自动装配候选条件的Bean。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)}
相关代码
Repository接口
package com.myapp.repository; import org.springframework.data.jpa.repository.JpaRepository; import com.myapp.model.User; public interface MyAppUsersListRepository extends JpaRepository<User, Long> { }
实体类User
package com.myapp.model; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Table; @Entity @Table(name="MyAppUsersList") public class User { @Column(name="username") private String userNameA; @Column(name="email") private String emailIdA; @Column(name="password") private String passwordA; public User(String userName,String password,String email) { this.userNameA=userName; this.passwordA=password; this.emailIdA=email; } public String getUserNameA() { return userNameA; } public void setUserNameA(String userName) { this.userNameA = userName; } public String getPasswordA() { return passwordA; } public void setPasswordA(String pswd) { this.passwordA = pswd; } public String getEmailIdA() { return emailIdA; } public void setEmailIdA(String emailIdA) { this.emailIdA = emailIdA; } }
控制器类
@CrossOrigin(origins = "http://localhost:8080 ") @RestController public class MyAppHomeController { static boolean MethodExecutedOrNot = false; @Autowired MyAppUsersListRepository myAppUserRepository; @PostMapping(value="/storeRegistrationDataForH2") public ResponseEntity<User> storeRegistrationDataForH2(@RequestBody User userObj) { try { User user=myAppUserRepository.save(new User(userObj.getUserNameA(),userObj.getPasswordA(),userObj.getEmailIdA())); return new ResponseEntity<>(user,HttpStatus.CREATED); } catch(Exception exception) { loggerObj.log(Level.FATAL,"error in user registration in h2 database(using log)"); return new ResponseEntity<>(null,HttpStatus.INTERNAL_SERVER_ERROR); } } }
启动类
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { ConfigurableApplicationContext appContext =SpringApplication.run(DemoApplication.class, args); String[] beans=appContext.getBeanDefinitionNames(); for(String obj:beans) { System.out.println("ApplicationContextObject:"+obj); } } }
问题分析与解决方案
1. 包扫描范围不匹配
启动类DemoApplication位于com.example.demo包,而Repository接口在com.myapp.repository包下,Spring Boot默认仅扫描启动类所在包及其子包的组件,导致无法识别Repository。
- 修复方式:在启动类上添加注解指定扫描范围
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication @ComponentScan(basePackages = {"com.myapp"}) @EnableJpaRepositories(basePackages = {"com.myapp.repository"}) public class DemoApplication { public static void main(String[] args) { ConfigurableApplicationContext appContext = SpringApplication.run(DemoApplication.class, args); String[] beans = appContext.getBeanDefinitionNames(); for(String obj : beans) { System.out.println("ApplicationContextObject:" + obj); } } }
2. Repository重复定义且缺少注解
代码中重复定义了MyAppUsersListRepository,且原始Repository未添加@Repository注解(虽Spring Data JPA会自动代理,但显式注解更规范)。
- 修复方式:删除控制器下方重复的Repository定义,给原始Repository添加
@Repository注解
package com.myapp.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.myapp.model.User; @Repository public interface MyAppUsersListRepository extends JpaRepository<User, Long> { }
3. 实体类缺少无参构造函数
JPA要求实体类必须提供无参构造函数,当前User类只有带参构造,导致Spring无法实例化实体。
- 修复方式:给
User类添加无参构造函数
public User() {}
4. 检查依赖完整性
确保项目依赖中包含Spring Data JPA和对应数据库驱动,以H2为例,pom.xml需包含:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency>
内容的提问来源于stack exchange,提问作者Muralidharan G

