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

Micronaut中@JsonDeserialize注解未按预期生效问题

Micronaut中Duration字段反序列化未按预期工作问题

环境信息

  • OS: Windows 11
  • JDK: corretto-17.0.6
  • IDE: IntelliJ IDEA 2022.3.1
  • Micronaut版本: 3.7.3

问题场景

开发了一个执行基础IO操作的Micronaut应用,DTO类EventBean中的duration字段需要以毫秒为单位处理,而非默认的秒。

POST接口代码如下:

@Post
public EventBean create(@Body EventBean eventBean) {
    return eventBean;
}

发送的JSON请求体:

{
    "from": "2023-03-05T12:26:43.538Z",
    "duration": 600000
}

预期返回与请求体一致,但实际返回:

{
    "from": "2023-03-05T12:26:43.538Z",
    "duration": 600000000
}

EventBean类代码:

@Introspected
public class EventBean {
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone = "UTC")
    private final Instant from;

    @JsonSerialize(converter = DurationSerializer.class)
    @JsonDeserialize(converter = DurationDeserializer.class)
    private final Duration duration;

    public EventBean(Instant from, Duration duration) {
        this.from = from;
        this.duration = duration;
    }

    public Instant getFrom() {
        return from;
    }

    public Duration getDuration() {
        return duration;
    }

    public static class DurationSerializer extends StdConverter<Duration, Long> {
        @Override public Long convert(Duration value) {
            return value.toMillis();
        }
    }

    public static class DurationDeserializer extends StdConverter<Long, Duration> {
        @Override public Duration convert(Long value) {
            return Duration.ofMillis(value);
        }
    }
}

核心问题

反序列化JSON请求体时,自定义的DurationDeserializer未被调用(DurationSerializer工作正常)。尝试过使用JsonDeserializer<T>类配合@JsonDeserialize注解的using属性,同样无效。

临时解决方法

通过Micronaut的@Replaces注解替换Jackson默认的DurationDeserializer:

@Replaces(value = com.fasterxml.jackson.datatype.jsr310.deser.DurationDeserializer.class)
public class DurationDeserializer extends JsonDeserializer<Duration> {
    @Override public Duration deserialize(JsonParser p, DeserializationContext ctxt)
        throws IOException {
        return Duration.ofMillis(p.getLongValue());
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:40:18