如何禁用Jackson从时代毫秒对Instant进行反序列化?

时间:2019-05-15 22:19:25

标签: java spring-boot jackson jsr310

我正在使用Spring Boot开发API,并且正在使用Jackson进行有效负载(反序列化)。我想将ISO-8601格式的日期时间反序列化为java.time.Instant,但不希望支持从以毫秒或纳秒为单位的历元时间反序列化。我只想支持以一种格式提供给我的API的数据,以减少出现客户端错误的机会。

当前,Jackson从ISO-8601格式的字符串和仅包含数字(例如,数字)的字符串中反序列化为Instant。 "20190520"

我可以在我的Instant字段中使用Jackson注释,还是可以设置以应用这种行为的属性?还是自定义解串器是我唯一的选择?

1 个答案:

答案 0 :(得分:1)

  

我可以在“即时”字段中使用Jackson注释,还是可以设置以应用这种行为的属性?还是自定义解串器是我唯一的选择?

我个人不知道会为您开箱即用的注释;但是以下是完成此工作的简单反序列化器:

import java.io.IOException;
import java.time.Instant;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;

public class JacksonInstantDeserializer extends StdDeserializer<Instant> {
    public JacksonInstantDeserializer() { this(null); }
    public JacksonInstantDeserializer(Class<?> clazz) { super(clazz); }

    @Override
    public Instant deserialize(JsonParser parser, DeserializationContext ctx) throws IOException {
        return Instant.parse(parser.getText());
    }
}

它基本上使用Instant.parse;它仅接受 ISO-8601 formatted string(如果未对字符串进行相应格式设置,则会抛出DateTimeParseException),并根据其表示形式创建Instant。然后,您可以使用Tell Jackson来使用此转换器以以下方式反序列化DTO的Instant属性:

    public class MyDTO {
        @JsonDeserialize(using = JacksonInstantDeserializer.class)
        public Instant instant;
    }

希望这会有所帮助。