如何在@SpringBootTest中注入自定义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

