关于LocalDateTime序列化问题

项目中遇到RocketMQ不支持LocalDateTime序列化的问题,尝试在字段上添加注解引发新的错误。问题源于将时间秒值直接传递,与序列化方式冲突。解决方案是创建无注解DTO接收参数,然后转换为带注解的DTO,从而解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景说明:该项目已配置以下内容,只不过RocketMQ内块没有弄

class LocalDateTimeJsonSerializer extends JsonSerializer<LocalDateTime> {
    LocalDateTimeJsonSerializer() {
    }

    public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        if (Objects.nonNull(value)) {
            long time = value.toInstant(ZoneOffset.ofHours(8)).toEpochMilli() / 1000L;
            gen.writeNumber(time);
        }

    }
}
class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
    LocalDateTimeDeserializer() {
    }

    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        long time = p.getLongValue();
        if (time < 1L) {
            return null;
        } else {
            LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(time, 0, ZoneOffset.ofHours(8));
            return localDateTime;
        }
    }
}

于是在我发消息的时候就报错,不支持LocalDateTime的序列化,于是,俺想了想,就将LocalDateTime相关的字段加上了这两个注解:

    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    @JsonSerialize(using = LocalDateTimeSerializer.class)

但是,自从我加了这两个字段,他居然直接报错了…我就发现这个问题俺可能解决不了…聪明的我就去请教大佬了…

问题原因:
因为大佬写的lLocalDateTime序列化,首先是把时间转成秒值,但是我在传参的时候传的就是秒值(1641801601),导致该注解的字段赋值的时候就出现问题,如果我直接传2022-01-10T17:52:26.648527这种格式的,是完全没有问题的。
于是乎,最终的解决方案:
为了方便前端,我需要先用一个不带注解的DTO去接受参数,然后再将不带注解的DTO转换成带注解的DTO,此问题暂时解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值