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

Spring Boot中@Entity标注的Users实体Bean无法创建问题求助

Spring Boot启动失败问题排查与解决方案

核心错误原因

启动报错提示找不到Users类型的Bean,本质问题是:@Entity标注的实体类默认不会被Spring注册为容器管理的Bean,你在SecurityController的构造函数中直接注入Users和Authorities实体,Spring无法找到对应实例,导致启动失败。另外构造函数的赋值逻辑完全写反,即使注入成功也无法正常使用。

分步修复方案

1. 修正Controller的依赖注入与实体创建逻辑

实体类属于数据模型,需在使用时手动实例化,而非依赖Spring注入。同时,多个请求参数不能通过多个@RequestBody接收,需封装为DTO类:

package com.ncu.legalVise.controller;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.ncu.legalVise.entities.Authorities;
import com.ncu.legalVise.entities.Users;
import com.ncu.legalVise.repository.AuthoritiesRepository;
import com.ncu.legalVise.repository.UsersRepository;

@RestController
@RequestMapping("/api/public/security")
public class SecurityController {
    // 仅注入Repository类
    private final UsersRepository usersRepository;
    private final AuthoritiesRepository authoritiesRepository;

    // 构造函数注入(推荐final字段+构造函数注入的方式)
    public SecurityController(UsersRepository usersRepository, AuthoritiesRepository authoritiesRepository) {
        this.usersRepository = usersRepository;
        this.authoritiesRepository = authoritiesRepository;
    }

    @PostMapping("/register")
    public ResponseEntity<Object> register(@RequestBody RegisterRequest request) {
        String userName = request.getUserName();
        String password = request.getPassword();
        String authorities = request.getAuthorities();
        
        // 手动创建实体实例
        Users user = new Users(userName, password, 1);
        Authorities authority = new Authorities(userName, authorities);
        
        if (!usersRepository.existsById(userName)) {
            usersRepository.save(user);
            authoritiesRepository.save(authority);
            return ResponseEntity.ok(usersRepository.findById(userName));
        }
        return ResponseEntity.notFound().build();
    }

    // 封装请求参数的DTO类
    static class RegisterRequest {
        private String userName;
        private String password;
        private String authorities;

        // getter和setter方法
        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 getAuthorities() { return authorities; }
        public void setAuthorities(String authorities) { this.authorities = authorities; }
    }
}

2. 修复pom.xml依赖冲突

你的依赖配置存在多处冲突与冗余,需调整:

  • Spring Boot 3.x基于Jakarta EE规范,删除旧的hibernate-jpa-2.0-api(javax.persistence规范),避免与jakarta.persistence-api冲突;
  • 删除重复的mysql-connector-j依赖;
  • spring-boot-starter-web已内置tomcat依赖,无需单独引入spring-boot-starter-tomcat。

调整后的核心依赖部分:

<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-web</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-web-services</artifactId>
    </dependency>
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

3. 规范实体类注解(可选但推荐)

Spring Boot 3.x已全面切换到Jakarta EE,将实体类中的javax.persistence.*注解替换为jakarta.persistence.*,避免兼容问题:

package com.ncu.legalVise.entities;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@Table(name ="users")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Users {
    @Id
    private String username;
    @Column(nullable = false)
    private String password;
    @Column(nullable = false)
    private int enabled;

    // 已使用@Data注解,无需手动编写getter/setter,删除手动实现的部分
}

内容的提问来源于stack exchange,提问作者Neeraj Yadav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:22:35