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

JUnit测试中ZonedDateTime序列化异常返回Double类型问题咨询

解决Spring Boot单元测试中ZonedDateTime序列化异常问题

问题根因

返回科学计数法格式的Double字符串,是因为单元测试上下文未正确加载Jackson的Java 8时间类型序列化模块,也没有生效日期转ISO字符串的全局配置。

修复步骤

  • 第一步:确认引入JSR310时间序列化依赖
    Spring Boot 2.x及以上版本默认集成该依赖,自定义依赖管理的项目需显式引入:
<!-- Maven依赖示例 -->
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
  • 第二步:调整测试类注解确保配置加载
    如果使用@WebMvcTest做切片测试,默认不会加载全量Jackson自动配置,需要在测试类上加@AutoConfigureJson注解强制加载Jackson配置。
    如果是手动构建MockMvc使用standaloneSetup模式,需要手动绑定配置好的Jackson消息转换器:
@Autowired
private ObjectMapper objectMapper;

// 构建MockMvc时指定消息转换器
mockMvc = MockMvcBuilders.standaloneSetup(customerController)
        .setMessageConverters(new MappingJackson2HttpMessageConverter(objectMapper))
        .build();
  • 第三步:校验配置属性正确性
    检查application-test.properties中的配置拼写无误:
# 注意属性名的大小写和分隔符
spring.jackson.serialization.write-dates-as-timestamps=false
# 可选:显式指定时区和日期格式
spring.jackson.time-zone=Asia/Shanghai
spring.jackson.date-format=com.fasterxml.jackson.databind.util.ISO8601DateFormat

如果仅需要个别字段特殊格式化,可在DTO对应字段上加注解兜底:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
private ZonedDateTime createTime;
  • 第四步:兜底配置方案
    如果上述配置仍未生效,可在测试类中显式注册ObjectMapper配置:
@TestConfiguration
public class JacksonTestConfig {
    @Bean
    public ObjectMapper testObjectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        // 注册Java 8时间类型序列化模块
        mapper.registerModule(new JavaTimeModule());
        // 禁用日期转时间戳
        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        return mapper;
    }
}

在测试类上引入该配置即可:@Import(JacksonTestConfig.class)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:15:04