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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:31:14