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

Spring Boot测试报错:Failed to Load ApplicationContext - 非托管类型问题

解决Spring Boot测试中UserModel不被识别为托管实体的问题

运行Spring Boot测试时抛出IllegalStateException,提示Failed to load ApplicationContext,根源是UserModel不被识别为JPA托管实体,堆栈跟踪片段如下:

java.lang.IllegalStateException: Failed to load ApplicationContext
...

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController'
...

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userService'
...

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository'
...

Caused by: java.lang.IllegalArgumentException: Not a managed type: class com.alphaomegazed.aoz_apartments.model.UserModel

相关代码如下:

UserModel实体类

package com.alphaomegazed.aoz_apartments.model;

import javax.persistence.Entity;
import javax.persistence.Table;

import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.Column;
import javax.persistence.GenerationType; //included for identity strategy
import javax.persistence.GeneratedValue; //corrected import instead of javax.annotation

@Entity
public class UserModel {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

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

    @Column(nullable = false)
    private String password;

    // Getters-------------------------------------------------
    public Long getId() {
        return id;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    // Setters-------------------------------------------------
    public void setId(Long id) {
        this.id = id;
    }

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

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

UserRepository接口

package com.alphaomegazed.aoz_apartments.repository_interfaces;

import com.alphaomegazed.aoz_apartments.model.UserModel; //to be accessed
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.Optional; //this is part of the java.util package, but it needs to be included

public interface UserRepository extends JpaRepository<UserModel, Long> {

    // Used by UserDetailService to define wether or not the user exists
    Optional<UserModel> findByUsername(String username);

    Boolean existsByUsername(String username);
}

测试类

package com.alphaomegazed.aoz_apartments;

import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;

@ExtendWith(SpringExtension.class)
@SpringBootTest
public class AozApartmentsApplicationTests {

    @Test
    public void contextLoads() {
    }
}

原因分析与解决方案

1. 重复导入注解导致实体类失效

UserModel中重复导入了javax.persistence.GeneratedValue,可能引发编译时注解处理异常,导致JPA无法识别@Entity注解。
解决: 删除其中一行重复的导入,保留单个import javax.persistence.GeneratedValue;。

2. Spring Boot版本与JPA注解包不匹配

若使用Spring Boot 3.x版本,JPA注解已从javax.persistence迁移到jakarta.persistence,继续使用旧包会导致实体不被识别。
解决: 将所有javax.persistence.*的导入替换为jakarta.persistence.*:

// 替换前
import javax.persistence.Entity;
import javax.persistence.Id;
// ...其他javax包

// 替换后
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
// ...其他jakarta包

3. 实体与Repository扫描范围未明确指定

即使实体和Repository在启动类的子包下,部分场景下仍需明确指定扫描范围,避免Spring自动扫描遗漏。
解决: 在启动类AozApartmentsApplication上添加@EntityScan和@EnableJpaRepositories注解,明确扫描路径:

package com.alphaomegazed.aoz_apartments;

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
@EntityScan(basePackages = "com.alphaomegazed.aoz_apartments.model")
@EnableJpaRepositories(basePackages = "com.alphaomegazed.aoz_apartments.repository_interfaces")
public class AozApartmentsApplication {
    public static void main(String[] args) {
        SpringApplication.run(AozApartmentsApplication.class, args);
    }
}

4. 简化测试类注解

@SpringBootTest已经包含@ExtendWith(SpringExtension.class)的功能,无需重复添加,简化测试类代码:

package com.alphaomegazed.aoz_apartments;

import org.springframework.boot.test.context.SpringBootTest;
import org.junit.jupiter.api.Test;

@SpringBootTest
public class AozApartmentsApplicationTests {

    @Test
    public void contextLoads() {
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 11:43:25