Где можно зарегистрировать кодек Джексона в Vertx 4.0 с помощью пользовательского сопоставления объектов

Я пытаюсь преобразовать образец вершин Quarkus в чистый Vertx 4.0 и столкнулся с проблемой.

В Quarkus можно легко настроить Jackson ObjectMapper для сериализации или десериализации HTTP-сообщений.


@ApplicationScoped
public class CustomObjectMapper implements ObjectMapperCustomizer {

    @Override
    public void customize(ObjectMapper objectMapper) {
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        objectMapper.disable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS);
        objectMapper.disable(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS);

        JavaTimeModule module = new JavaTimeModule();
        LocalDateTimeDeserializer localDateTimeDeserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        module.addDeserializer(LocalDateTime.class, localDateTimeDeserializer);
        objectMapper.registerModule(module);
    }
}

А в Vertx, как изящно настроить ObjectMapper? Я намерен зарегистрировать пользовательский ObjectMapper вместо встроенного, поэтому при использовании Json.encode вместо него будет использоваться мой пользовательский objectMapper.

В моем образце VertxJson.encode будет использовать встроенный objectMapper для сериализации DateTime Java 8 в массив int вместо строки даты ISO.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
0
3 293
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, вам нужно добавить jackson-databind к вашим зависимостям, потому что Vert.x 4 не приносит транзитивно.

Затем в вашем основном методе:

io.vertx.core.json.jackson.DatabindCodec codec = (io.vertx.core.json.jackson.DatabindCodec) io.vertx.core.json.Json.CODEC;
// returns the ObjectMapper used by Vert.x
ObjectMapper mapper = codec.mapper();
// returns the ObjectMapper used by Vert.x when pretty printing JSON
ObjectMapper prettyMapper = codec.prettyMapper();

Теперь вы можете настроить оба маппера

Vertx настроил DatabindCodec (конечно, я включил привязку данных и модуль jsr310) с помощью JacksonFactory, которая определила там ObjectMapper. Я не знаю, как его настроить. Для моего приложения, когда я вызываю методы Json в обработчиках, Datetime Java 8 сериализуется не в строку, а в массив int (это общая проблема в Java, которую можно исправить, настроив параметры ObjectMapper).

Hantsy 11.12.2020 03:17

Для меня (VertX 4.0.3) mapper() и prettyMapper() являются статическими методами на DatabindCodec. Таким образом, доступ к классу Json и приведение кодека кажется ненужным. Вы можете получить доступ к картографу напрямую, например. DatabindCodec.mapper().

stempler 05.05.2021 09:39

Другие вопросы по теме