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

Spring Boot启动报错:Not a managed type: com.sharesmiles.model.User求助

问题:Spring Boot启动时JPA实体未被识别(Not a managed type)

执行mvn spring-boot:run启动项目时,抛出依赖注入异常,核心错误为Not a managed type: class com.sharesmiles.model.User,完整异常栈如下:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController': Unsatisfied dependency expressed through field 'userService': Error creating bean with name 'userService': Unsatisfied dependency expressed through field 'userRepository': Error creating bean with name 'userRepository' defined in com.sharesmiles.repository.UserRepository defined in @EnableJpaRepositories declared on ShareSmilesApplication: Not a managed type: class com.sharesmiles.model.User

核心代码

1. User实体类

package com.sharesmiles.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private Long userId;
    private String username;
    private String password;
    private String email;
}

2. 项目启动类

package com.sharesmiles;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@SpringBootApplication
@ComponentScan(basePackages = {"com.sharesmiles"})
@EnableJpaRepositories(basePackages = {"com.sharesmiles.repository"})
@EntityScan("com.sharesmiles.model")
public class ShareSmilesApplication {
    public static void main(String[] args) {
        SpringApplication.run(ShareSmilesApplication.class, args);
    }
}

3. UserRepository接口

package com.sharesmiles.repository;

import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import com.sharesmiles.model.User;

public interface UserRepository extends JpaRepository<User, Long>{
    Optional<User> findByUsername(String username);
    Optional<User> findByEmail(String email);
}

4. UserService业务类

package com.sharesmiles.service;
import com.sharesmiles.model.User;
import com.sharesmiles.repository.UserRepository;

import jakarta.persistence.EntityNotFoundException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.security.authentication.BadCredentialsException;

import java.time.Duration;
import java.util.Optional;
import java.util.regex.Pattern;

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    @Autowired
    private RedisTemplate<String, User> userRedisTemplate;

    private BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
    
    private boolean isValidPassword(String password) {
        return (password.length() >= 6);
    }
    // 用户注册方法
    public User userRegister(User user) {
        if (!isValidName(user.getUsername()))
            throw new IllegalArgumentException("Username is not valid");

        if (!isValidEmail(user.getEmail()))
            throw new IllegalArgumentException("Email is not valid");
        
        if (!isValidPassword(user.getPassword()))
            throw new IllegalArgumentException("Password is not valid");

        Optional<User> existingUser = userRepository.findByEmail(user.getEmail());
        if (existingUser.isPresent()) 
            throw new IllegalStateException("Email already in use");
        
        String hashedPassword = passwordEncoder.encode(user.getPassword());
        user.setPassword(hashedPassword);

        return userRepository.save(user);
    }
}

5. UserController控制类

package com.sharesmiles.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
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.sharesmiles.model.User;
import com.sharesmiles.service.UserService;


@RestController
@RequestMapping("/api/user")
public class UserController {
    @Autowired
    private UserService userService;

    @PostMapping("/register")
    public ResponseEntity<User> register(@RequestBody User user) {
        User registeredUser = userService.userRegister(user);
        return new ResponseEntity<User>(registeredUser, HttpStatus.CREATED);
    }
}

6. pom.xml依赖配置

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>javax.persistence-api</artifactId>
            <version>2.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.7.0</version> 
        </dependency>

        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>2.8.0</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version> 
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>javax.mail-api</artifactId>
            <version>1.6.2</version>
        </dependency>

        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.16.4</version> 
        </dependency>

        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>

    </dependencies>

解决方案

问题根源

错误核心是JPA无法识别User为受管理实体,主要由两个原因导致:

  1. 依赖冲突:同时引入spring-boot-starter-data-jpa和spring-boot-starter-data-jdbc,且手动添加javax.persistence-api,和Spring Boot自带的JPA API版本冲突。
  2. 注解包不匹配:若使用Spring Boot 3.x版本,默认采用Jakarta EE规范(jakarta.persistence),但实体类用了旧的javax.persistence注解,导致注解不被识别。

修复步骤

1. 清理冲突依赖

删除pom.xml中以下两个依赖:

  • spring-boot-starter-data-jdbc:JPA和JDBC starter无需同时引入,会引发自动配置冲突。
  • javax.persistence-api:spring-boot-starter-data-jpa已包含对应依赖,手动添加会导致版本冲突。

修改后的依赖部分见上文核心代码的pom.xml(已移除冲突项)。

2. 统一实体注解包

如果项目使用Spring Boot 3.x,将实体类的javax.persistence替换为jakarta.persistence:

package com.sharesmiles.model;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class User {
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private Long userId;
    private String username;
    private String password;
    private String email;
}

3. 简化启动类配置

@SpringBootApplication已包含@ComponentScan(默认扫描启动类所在包及子包),可移除手动添加的@ComponentScan:

package com.sharesmiles;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@SpringBootApplication
@EnableJpaRepositories(basePackages = {"com.sharesmiles.repository"})
@EntityScan("com.sharesmiles.model")
public class ShareSmilesApplication {
    public static void main(String[] args) {
        SpringApplication.run(ShareSmilesApplication.class, args);
    }
}

4. 重启项目

执行mvn clean install清理缓存后,再运行mvn spring-boot:run,异常即可解决。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:59:53