You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:57:07