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

Spring Boot WebFlux环境下ZonedDateTime自定义序列化配置无效,始终被序列化为秒级浮点时间戳求助

Spring Boot WebFlux环境下ZonedDateTime自定义序列化配置无效,始终被序列化为秒级浮点时间戳求助

兄弟我太懂你这种被框架“无视”的憋屈感了!折腾了各种Jackson配置,代码明明执行了但WebFlux的RestController就是不买账,ZonedDateTime还是顽固地输出秒级浮点时间戳,这事儿确实闹心。

问题根源

你之前的配置之所以没生效,核心原因是WebFlux和传统Spring MVC的配置逻辑不一样:WebFlux的HTTP消息编解码器是独立维护的,你通过ObjectMapper Bean、Jackson2ObjectMapperBuilderCustomizer注册的自定义规则,并没有被WebFlux的RestController默认复用——它用的是自己单独实例化的Jackson编解码器,完全绕开了你的全局配置。

解决办法:直接替换WebFlux的Jackson编解码器

要让RestController乖乖听话,你得直接修改WebFlux的HTTP消息编解码器配置,把你的自定义序列化规则塞进WebFlux用的那套Jackson实例里:

1. 编写WebFlux专属配置类

@Configuration
public class WebFluxJacksonConfig implements WebFluxConfigurer {

    @Override
    public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
        // 构建带有自定义序列化规则的ObjectMapper
        ObjectMapper customObjectMapper = Jackson2ObjectMapperBuilder.json()
                .modules(createZonedDateTimeModule())
                .build();

        // 替换WebFlux默认的Jackson编解码器
        configurer.defaultCodecs().jackson2JsonEncoder(new Jackson2JsonEncoder(customObjectMapper));
        configurer.defaultCodecs().jackson2JsonDecoder(new Jackson2JsonDecoder(customObjectMapper));
    }

    // 封装你的自定义ZonedDateTime序列化模块
    private SimpleModule createZonedDateTimeModule() {
        SimpleModule module = new SimpleModule("CustomZonedDateTimeModule");
        module.addSerializer(ZonedDateTime.class, new ZonedDateTimeTimestampSerializer());
        return module;
    }
}

2. 保留你的自定义序列化器

不用加@JsonComponent,因为已经通过模块注册了:

public class ZonedDateTimeTimestampSerializer extends JsonSerializer<ZonedDateTime> {
    @Override
    public void serialize(ZonedDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        if (value != null) {
            // 输出毫秒级时间戳,替换掉框架默认的秒级浮点
            gen.writeNumber(value.toInstant().toEpochMilli());
        }
    }
}

额外排查点

  1. 检查项目里有没有其他@Configuration类也注册了ObjectMapper并加了@Primary,如果有的话会覆盖你的配置,得把冲突的配置调整掉;
  2. 确认没有引入其他第三方Jackson模块(比如某些中间件的自定义模块),会不会偷偷覆盖了ZonedDateTime的序列化规则。

这种框架“黑盒”的差异确实容易踩坑,尤其是WebFlux和MVC的配置逻辑几乎是两套体系,按上面的方法改完,RestController应该就能按照你的要求输出毫秒级时间戳了!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 11:50:30