SpringBoot3.2.5+Java21升级后Controller测试出现routerFunctionMapping创建失败
问题分析与解决方案
核心原因定位
从报错栈来看,JacksonJsonProvider初始化时调用ObjectMapper.reader()返回null,这通常是Jackson版本不兼容或ObjectMapper实例未正确初始化导致的,结合SpringBoot 3.x的升级场景,主要排查方向如下:
1. 移除多余的@EnableWebMvc注解
@WebMvcTest已经自动配置了Spring MVC测试环境,手动添加@EnableWebMvc会覆盖SpringBoot的自动配置逻辑,导致RouterFunctionMapping等Bean的初始化流程异常。直接删除测试类上的@EnableWebMvc即可。
2. 修复依赖问题
- 删除重复的
spring-webmvc依赖:你的pom里重复声明了两次spring-webmvc,SpringBoot的spring-boot-starter-web已经包含该依赖,无需单独声明。 - 适配Jackson版本:SpringBoot 3.x默认使用Jackson 2.15+,确保
jayway json-path依赖版本适配该Jackson版本,直接用SpringBoot管理的版本即可:<dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <scope>test</scope> </dependency> - 修正Spring Security依赖的exclusion标签:原pom中的exclusion标签不完整,会导致依赖解析异常,修正为:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> <exclusions> <exclusion> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> </exclusion> </exclusions> </dependency>
3. 正确使用Spring管理的ObjectMapper
测试类中手动new ObjectMapper()会创建未被Spring配置的实例,和容器内的Jackson配置冲突。改为注入Spring容器中的ObjectMapper:
@Autowired private ObjectMapper mapper;
如果需要自定义配置,通过@Bean在测试配置类中定义,不要手动实例化。
4. 简化测试类配置
@InjectMocks在@WebMvcTest中无需使用,@WebMvcTest会自动扫描并注入Controller,@MockBean也会自动替换容器中的Service实例。移除@InjectMocks和手动创建的Controller实例,让Spring自动管理。
调整后的测试类示例:
@Slf4j @WebMvcTest(controllers = Controller.class) @Import({Test.class}) class ControllerTest extends TestClass { @Autowired private MockMvc mockMvc; @MockBean private Service service; private Gson gson = new GsonBuilder().create(); @Autowired private ObjectMapper mapper; @BeforeAll public static void init() { prepareErrorResponse(); prepareTestData(); } @Test void testGetList() throws Exception { List<Place> placeList = new ArrayList<>(); placeList.add(place); Mockito.when(service.getAllPlaces()).thenReturn(placeList); mockMvc.perform(get("/api/v1/places")).andExpect(status().isOk()); } }
5. 清理依赖缓存
如果以上步骤无效,清理Maven/Gradle的依赖缓存,重新下载所有依赖,避免旧版本依赖残留导致冲突。
内容的提问来源于stack exchange,提问作者Shagun
相关产品推荐
相关产品推荐

