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

Spring Boot 3.0.0:UserRepository Bean找不到问题求助

Spring Boot 3.0.0启动时找不到UserRepository Bean的问题

错误信息

启动应用时遇到以下错误:

描述:com.example.pcoshealthtracker.controller.RegistrationController构造方法的第0个参数需要类型为'com.example.pcoshealthtracker.repository.UserRepository'的Bean,但未找到。
建议操作:请在配置中定义类型为'com.example.pcoshealthtracker.repository.UserRepository'的Bean。

我的代码与配置

主应用类(初始版本)

package com.example.pcoshealthtracker;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@SpringBootApplication(scanBasePackages = "com.example.pcoshealthtracker")
@EnableJpaRepositories(basePackages = "com.example.pcoshealthtracker.repository")
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

UserRepository代码

package com.example.pcoshealthtracker.repository;

import com.example.pcoshealthtracker.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    boolean existsByEmail(String email);
    boolean existsByUsername(String username);
}

RegistrationController代码

package com.example.pcoshealthtracker.controller;

import com.example.pcoshealthtracker.entity.User;
import com.example.pcoshealthtracker.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/api")
public class RegistrationController {

    private final UserRepository userRepository;
    private final BCryptPasswordEncoder passwordEncoder;

    @Autowired
    public RegistrationController(UserRepository userRepository, BCryptPasswordEncoder passwordEncoder) {
        this.userRepository = userRepository;
        this.passwordEncoder = passwordEncoder;
    }

    /**
     * Endpoint to register a new user.
     */
    @PostMapping("/register")
    public ResponseEntity<Map<String, String>> registerUser(@RequestBody User user) {
        Map<String, String> response = new HashMap<>();

        // Check if email or username already exists
        if (userRepository.existsByEmail(user.getEmail())) {
            response.put("status", "error");
            response.put("message", "Email is already registered.");
            return ResponseEntity.badRequest().body(response);
        }

        if (userRepository.existsByUsername(user.getUsername())) {
            response.put("status", "error");
            response.put("message", "Username is already taken.");
            return ResponseEntity.badRequest().body(response);
        }

        try {
            // Hash the user's password before saving
            user.setPassword(passwordEncoder.encode(user.getPassword()));
            userRepository.save(user);

            response.put("status", "success");
            response.put("redirectUrl", "/login.html");
            return ResponseEntity.ok(response);
        } catch (Exception e) {
            response.put("status", "error");
            response.put("message", "Registration failed: " + e.getMessage());
            return ResponseEntity.badRequest().body(response);
        }
    }

    /**
     * Endpoint to check the availability of a username or email.
     */
    @PostMapping("/check-availability")
    public ResponseEntity<Map<String, Boolean>> checkAvailability(@RequestBody Map<String, String> payload) {
        Map<String, Boolean> response = new HashMap<>();

        String email = payload.get("email");
        String username = payload.get("username");

        if (email != null && !email.isEmpty()) {
            response.put("available", !userRepository.existsByEmail(email));
            return ResponseEntity.ok(response);
        }

        if (username != null && !username.isEmpty()) {
            response.put("available", !userRepository.existsByUsername(username));
            return ResponseEntity.ok(response);
        }

        response.put("available", false); // Invalid request
        return ResponseEntity.badRequest().body(response);
    }
}

User实体类代码

package com.example.pcoshealthtracker.entity;

import jakarta.persistence.*;
import java.time.LocalDateTime;

@Entity
@Table(name = "Users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id")
    private Long userId;

    @Column(name = "email", nullable = false, unique = true)
    private String email;

    @Column(name = "username", nullable = false, unique = true) 
    private String username;

    @Column(name = "password", nullable = false)
    private String password;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "date_created", columnDefinition = "TIMESTAMP")
    private LocalDateTime dateCreated = LocalDateTime.now();

    // Getters and Setters
    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getUsername() { 
        return username;
    }

    public void setUsername(String username) { 
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public LocalDateTime getDateCreated() {
        return dateCreated;
    }

    public void setDateCreated(LocalDateTime dateCreated) {
        this.dateCreated = dateCreated;
    }
}

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 http://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>3.0.0</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.example.pcoshealthtracker</groupId>
    <artifactId>pcos_health_tracker</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>pcos_health_tracker</name>
    <url>http://www.example.com</url>

    <properties>
        <java.version>17</java.version>
    </properties>

    <dependencies>
        <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
        <!-- Spring Boot Web Starter for building web applications -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <!-- Spring Boot JPA Starter for database interactions with JPA -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        
        <!-- MySQL Connector for MySQL database connection -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.32</version>
        </dependency>
        
        <!-- Spring Boot DevTools for development utilities -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        
        <!-- Spring Boot Starter JDBC for database connections -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        
        <!-- Spring Boot Starter Test for testing utilities -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        
        <!-- JUnit Jupiter for testing -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>
        
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>5.0.0</version> 
    <scope>provided</scope>
</dependency>

    </dependencies>

    <build>
        <plugins>
            <!-- Spring Boot Maven Plugin for building and running the application -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

application.properties配置

# Database Configuration for pcos_health_tracker
spring.datasource.url=jdbc:mysql://localhost:3306/pcos_health_tracker
spring.datasource.username=root
spring.datasource.password=563324
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# JPA settings
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.main.allow-bean-definition-overriding=true


# Logging level
logging.level.org.springframework=DEBUG

server.port=8080

尝试过的主应用类(添加ComponentScan)

package com.example.pcoshealthtracker; // Note the package

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Bean;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@SpringBootApplication
@ComponentScan(basePackages = "com.example.pcoshealthtracker") // Scanning the root package
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

问题

已尝试添加ComponentScan,但仍出现相同错误,求解决办法。


解决思路

  1. 简化主应用类注解
    @SpringBootApplication已包含@ComponentScan、@EnableAutoConfiguration和@Configuration,主类在根包com.example.pcoshealthtracker下时,默认会扫描所有子包,无需额外指定扫描路径。同时@EnableJpaRepositories默认也会扫描主类所在包及其子包,因此可以简化主类:
package com.example.pcoshealthtracker;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
  1. 检查包结构拼写
    确认所有类的包路径完全正确,比如UserRepository是否确实在com.example.pcoshealthtracker.repository下,避免大小写、拼写错误(如把repository写成repo)。

  2. 清理项目缓存并重新构建
    执行mvn clean install清理编译缓存,重新构建项目后再启动,避免IDE或构建工具缓存导致的扫描异常。

  3. 移除冗余依赖
    spring-boot-starter-data-jpa已包含JDBC相关依赖,pom.xml中同时存在spring-boot-starter-jdbc可能引发冲突,尝试移除该依赖。

  4. 验证数据库连接
    查看启动日志,确认数据库服务正常运行,application.properties中的数据库URL、用户名、密码正确,确保JPA能正常初始化数据源。

  5. 检查实体类注解
    Spring Boot 3.x使用Jakarta EE注解(jakarta.persistence.*),你的User实体注解正确,但需确保实体类在主类的扫描范围内(当前包结构符合要求)。


内容的提问来源于stack exchange,提问作者Candice Nicole

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:49:50