Spring集成测试启动失败:找不到InstantiationAwareBeanPostProcessorAdapter类
问题排查与解决方案
1. ClassNotFoundException: InstantiationAwareBeanPostProcessorAdapter 异常修复
该类在Spring 5.3+版本已被移除,Spring Boot 3依赖Spring 6,因此不存在这个类。异常原因通常是:
- 项目引入了依赖旧Spring版本的第三方库
- 代码中直接引用了这个已废弃的类
修复步骤:
- 检查
pom.xml或build.gradle,确保所有Spring相关依赖版本与Spring Boot 3对齐,排除旧版本依赖 - 若自定义代码中引用了该类,替换为
org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,直接实现该接口即可
2. 集成测试类的问题修复
你的测试类混用了JUnit 4和JUnit 5 API,导致运行冲突:
- 导入了JUnit 5的
@Test,却使用JUnit 4的@RunWith(Suite.class) - Spring Boot 3默认使用JUnit 5,无需依赖JUnit 4的
@RunWith
修改后的测试代码:
import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class Spring3jwtdemoApplicationTests { @Autowired private TestRestTemplate restTemplate; @Test public void contextLoads() { System.out.println("This should work"); } }
若需测试套件功能,改用JUnit 5的@Suite注解(需添加junit-platform-suite依赖):
import org.junit.platform.suite.api.SelectClasses; import org.junit.platform.suite.api.Suite; @Suite @SelectClasses(Spring3jwtdemoApplicationTests.class) public class TestSuite { }
3. SecurityConfiguration 编译错误修复
Spring Boot 3对应的Spring Security 6移除了WebSecurityConfigurerAdapter,需采用基于Bean的配置方式:
- 移除继承
WebSecurityConfigurerAdapter的代码,改为定义SecurityFilterChain、UserDetailsService、PasswordEncoder等Bean - 确保所有Spring Security API调用符合Spring Security 6语法,比如权限表达式、过滤器配置
示例配置结构:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity public class SecurityConfiguration { private final UserDetailsService userDetailsService; public SecurityConfiguration(UserDetailsService userDetailsService) { this.userDetailsService = userDetailsService; } @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .csrf(csrf -> csrf.disable()) .authorizeHttpRequests(auth -> auth .requestMatchers("/api/auth/**").permitAll() .anyRequest().authenticated() ); return http.build(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception { return config.getAuthenticationManager(); } }
内容的提问来源于stack exchange,提问作者Jak
相关产品推荐
相关产品推荐

