Spring Boot启动报错:CommandLineRunner依赖的UserDAO Bean无法找到
问题:无法找到UserDAO类型的Bean
启动主应用时,com.project314.screenSavvy.Cinema.ScreenSavvyApplication类中的commandLineRunner方法的第0个参数需要类型为com.project314.screenSavvy.dao.UserDAO的Bean,但该Bean未被找到。
相关代码文件
UserAccount.java
package com.project314.screenSavvy.Cinema.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name= "user_account") public class UserAccount { // define fields @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="id") private int id; @Column(name="first_name") private String first_name; @Column(name="last_name") private String last_name; @Column(name="email") private String email; @Column(name="password") private String password; //define no arg constructor public UserAccount() { } //define constructor public UserAccount(String first_name, String last_name, String email, String password) { super(); this.first_name = first_name; this.last_name = last_name; this.email = email; this.password = password; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getFirst_name() { return first_name; } public void setFirst_name(String first_name) { this.first_name = first_name; } public String getLast_name() { return last_name; } public void setLast_name(String last_name) { this.last_name = last_name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } //define toString() @Override public String toString() { return "UserAccount [id=" + id + ", first_name=" + first_name + ", last_name=" + last_name + ", email=" + email + ", password=" + password + "]"; } }
UserDAO.java
package com.project314.screenSavvy.Cinema.dao; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import com.project314.screenSavvy.entity.UserAccount; @Component @Service public interface UserDAO { void save(UserAccount userAcc); }
UserDAOImpl.java
package com.project314.screenSavvy.Cinema.dao; import javax.persistence.EntityManager; import javax.transaction.Transactional; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import com.project314.screenSavvy.entity.UserAccount; @Repository public class UserDAOImpl implements UserDAO { //define field for entity manager private EntityManager entityManager; @Autowired //inject entity manager using constructor public UserDAOImpl(EntityManager entityManager) { this.entityManager = entityManager; } @Override @Transactional public void save(UserAccount userAcc) { // TODO Auto-generated method stub entityManager.persist(userAcc); } }
ScreenSavvyApplication.java
package com.project314.screenSavvy.Cinema; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import com.project314.screenSavvy.dao.UserDAO; import com.project314.screenSavvy.entity.UserAccount; @EnableAutoConfiguration @SpringBootApplication public class ScreenSavvyApplication { public static void main(String[] args) { SpringApplication.run(ScreenSavvyApplication.class, args); } @Bean public CommandLineRunner commandLineRunner(UserDAO userDAO) { return runner -> { createUser(userDAO); }; } // ... private void createUser(UserDAO userDAO) { //create user object System.out.println("Creating user object"); UserAccount userAcc = new UserAccount("John", "Smith","johnsmith@gmail.com","johnsmith123"); //save user object System.out.println("Saving the user"); userDAO.save(userAcc); System.out.println("Saved user. Generated id: " + userAcc.getId()); } }
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.3.0.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <groupId>net.javaguides</groupId> <artifactId>registration-login-spring-boot-security-thymeleaf</artifactId> <version>0.0.1-SNAPSHOT</version> <name>registration-login-spring-boot-security-thymeleaf</name> <description>Demo project for Spring Boot Thymeleaf and Hibernate </description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity5</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
文件目录结构

修复方案
1. 修正包导入路径
ScreenSavvyApplication中导入的UserDAO包路径错误,实际UserDAO位于com.project314.screenSavvy.Cinema.dao,但代码中导入的是com.project314.screenSavvy.dao,缺少Cinema层级。修改导入语句:
// 替换原导入语句 import com.project314.screenSavvy.Cinema.dao.UserDAO;
2. 移除DAO接口上的多余注解
接口不需要添加@Component或@Service注解,这些注解应该加在实现类上。修改UserDAO.java:
package com.project314.screenSavvy.Cinema.dao; import com.project314.screenSavvy.entity.UserAccount; public interface UserDAO { void save(UserAccount userAcc); }
3. 确认组件扫描范围
@SpringBootApplication默认扫描主类所在包(com.project314.screenSavvy.Cinema)及其子包,UserDAOImpl位于com.project314.screenSavvy.Cinema.dao,属于子包,Spring会自动扫描到该Bean,无需额外配置。
完成以上修改后,重新启动应用即可解决Bean找不到的问题。
内容的提问来源于stack exchange,提问作者HelpAGirlOut
相关产品推荐
相关产品推荐

