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

如何在@SpringBootTest中注入自定义ObjectMapper?

Spring Boot 3.1.5 测试中自定义ObjectMapper不生效的解决方案

问题描述

影响版本:3.1.5
自定义ObjectMapper通过以下配置实现,应用运行时正常生效,但在@SpringBootTest(Controller.class)中无法复用该配置:

@Autowired
private ObjectMapper objectMapper;

@Override
public void extendMessageConverters (List<HttpMessageConverter<?>> converters) {
    converters.stream()
            .filter(x -> x instanceof MappingJackson2HttpMessageConverter)
            .forEach(x -> ((MappingJackson2HttpMessageConverter) x).setObjectMapper(objectMapper));
}

尝试通过MockMvcBuilders.standaloneSetup(controller).setControllerAdvice(jsonConfiguration).build()配置后仍未生效,需解决测试环境中复用自定义ObjectMapper的问题。


可行解决方案

方案一:加载完整应用上下文

你当前的@SpringBootTest(Controller.class)仅指定单个Controller,Spring不会自动加载你的WebMvcConfigurer实现类(即配置extendMessageConverters的类)。修改测试类注解,让Spring加载完整上下文:

@SpringBootTest
@AutoConfigureMockMvc
class YourControllerTest {
    @Autowired
    private MockMvc mockMvc;
    
    // 编写测试方法
}

此方式下,Spring会自动加载所有配置类,MockMvc将直接复用应用中生效的自定义ObjectMapper配置。

方案二:手动配置Standalone MockMvc的消息转换器

若需使用standaloneSetup隔离测试上下文,不能仅依赖setControllerAdvice,需手动将自定义ObjectMapper绑定到消息转换器:

@Autowired
private ObjectMapper customObjectMapper;

@Autowired
private YourController controller;

@BeforeEach
void setupMockMvc() {
    MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter();
    jacksonConverter.setObjectMapper(customObjectMapper);
    
    mockMvc = MockMvcBuilders.standaloneSetup(controller)
            .setMessageConverters(jacksonConverter)
            .build();
}

该方式直接将自定义ObjectMapper注入MockMvc的消息转换器链,确保测试逻辑与应用运行时一致。

方案三:确保自定义ObjectMapper正确注册为Bean

如果你的自定义ObjectMapper未通过@Bean注册,需先在配置类中完成Bean定义,确保Spring能扫描并注入:

@Configuration
public class JsonConfiguration {
    @Bean
    public ObjectMapper customObjectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        // 添加你的自定义配置,如日期格式化、枚举序列化规则等
        return mapper;
    }
}

完成Bean注册后,无论是应用运行还是测试环境,Spring都能正确注入该自定义ObjectMapper。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:25:12