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

SpringBoot中TestRestTemplate与LocalDateTime协同工作异常问题排查

解决TestRestTemplate与LocalDateTime序列化兼容问题

你已经搞定了应用端的LocalDateTime序列化配置,但TestRestTemplate因为自身的ObjectMapper配置独立于Spring Boot全局配置,才会出现异常。别担心,我给你几个实用的解决方案:

方案1:让TestRestTemplate复用Spring容器的ObjectMapper

TestRestTemplate默认会创建独立的ObjectMapper实例,不会自动读取你在application.properties里的配置。所以要让它用上Spring管理的ObjectMapper:

在测试类中不要手动new TestRestTemplate,通过依赖注入获取后,替换它的消息转换器:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class YourTestClass {

    @Autowired
    private TestRestTemplate restTemplate;

    @Autowired
    private ObjectMapper objectMapper;

    @BeforeEach
    void setUp() {
        // 找到Jackson消息转换器并替换为Spring的ObjectMapper
        for (HttpMessageConverter<?> converter : restTemplate.getMessageConverters()) {
            if (converter instanceof MappingJackson2HttpMessageConverter) {
                ((MappingJackson2HttpMessageConverter) converter).setObjectMapper(objectMapper);
                break;
            }
        }
    }

    // 你的测试方法...
}

方案2:自定义TestRestTemplate Bean

如果多个测试类都需要配置好的TestRestTemplate,可以在测试配置类里定义Bean:

@TestConfiguration
public class TestRestTemplateConfig {

    @Bean
    public TestRestTemplate testRestTemplate(ObjectMapper objectMapper) {
        TestRestTemplate restTemplate = new TestRestTemplate();
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setObjectMapper(objectMapper);
        // 移除原有Jackson转换器,替换为配置好的版本
        restTemplate.getMessageConverters().removeIf(c -> c instanceof MappingJackson2HttpMessageConverter);
        restTemplate.getMessageConverters().add(converter);
        return restTemplate;
    }
}

之后在测试类中直接注入这个Bean即可。

方案3:手动注册LocalDateTime序列化器(独立配置)

如果只想在测试场景单独配置,可以手动给TestRestTemplate的ObjectMapper注册序列化支持:

@BeforeEach
void setUp() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    mapper.registerModule(new JavaTimeModule()); // 该模块包含LocalDateTime的序列化/反序列化实现

    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(mapper);
    restTemplate.getMessageConverters().removeIf(c -> c instanceof MappingJackson2HttpMessageConverter);
    restTemplate.getMessageConverters().add(converter);
}

验证方法

测试时可以打印响应体或断言字段格式,确认配置生效:

@Test
void testLocalDateTimeSerialization() {
    ResponseEntity<YourBean> response = restTemplate.getForEntity("/your-endpoint", YourBean.class);
    YourBean bean = response.getBody();
    assertNotNull(bean.getCreated());
    System.out.println("Created time: " + bean.getCreated()); // 应输出类似2018-04-22T21:21:53.025的格式
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:54:22