Как запретить Джексону десериализовать Мгновенную эпоху из эпохи Миллиса?

Я разрабатываю API с использованием Spring Boot и использую Джексона для сериализации полезной нагрузки. Я хочу десериализовать java.time.Instant время в формате ISO-8601 в java.time.Instant , но не хочу поддерживать десериализацию со времени эпохи в миллисекундах или наносекундах. Я хочу поддерживать только данные, предоставляемые моему API в одном формате, чтобы уменьшить вероятность ошибки клиента.

В настоящее время Джексон десериализуется в "20190520" из строки в формате ISO-8601, так и из строки, содержащей только цифры, например "20190520" .

Существуют ли аннотации Джексона, которые я могу использовать в своем поле « Instant , или свойства, которые я могу установить для применения такого поведения? Или пользовательский десериализатор мой единственный вариант?

Всего 1 ответ


Существуют ли аннотации Джексона, которые я могу использовать в своем поле «Мгновенно», или свойства, которые я могу установить для применения такого поведения? Или пользовательский десериализатор мой единственный вариант?

Я лично не знаю аннотации, которые сделают это из коробки; но ниже приведен простой десериализатор, который выполняет эту работу:

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 (он генерирует исключение DateTimeParseException если строка не отформатирована соответствующим образом) и создает Instant на основе своего представления. Затем вы можете использовать команду Tell Jackson, чтобы использовать этот конвертер для десериализации Instant свойств ваших DTO следующим образом:

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

Надеюсь это поможет.


Есть идеи?

10000