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
相关产品推荐
相关产品推荐

