Как зарегистрировать модуль Джексона в Quarkus?

Я хотел бы зарегистрировать модуль Kotlin с Jackson в приложении Quarkus, чтобы Джексон мог десериализовать JSON в классы данных без использования NoArgsConstructor. Как лучше всего это сделать?

Обновить после комментария

Приложение представляет собой службу REST, написанную на Kotlin. На уровне API мы используем классы View (например, PersonView или PersonWriteView), чтобы абстрагироваться от моделей и сущностей в сервисе, соответственно. слой стойкости. Чтобы уменьшить накладные расходы и при этом получить красивые и значимые функции equals () и hashcode (), мы используем для этого data classes.

В стандартных настройках Джексон не может напрямую десериализоваться в классы данных, потому что ему нужен пустой конструктор. Это можно исправить, применив плагин компилятора no-arg и добавив аннотацию, например @NoArgConstructor похоже на то, что предлагает Ломбок. Но, конечно, таким образом мы должны аннотировать каждый класс данных в API, который подвержен ошибкам.

Лучшее решение для этого - включить com.fasterxml.jackson.module: jackson-module-kotlin, который даст вам чудесный KotlinModule. После этого mapper.treeToValue() может напрямую создавать data class экземпляры без использования пустого конструктора. Чтобы это работало, мы должны зарегистрировать модуль в ObjectMapper, например. через ObjectMapper().findAndRegisterModules(). Все, что я хочу знать, это как настроить ObjectMapper, который используется Resteasy для демаршалинга JSON на объекты.


person Christoph Grimmer-Dietrich    schedule 06.05.2019    source источник
comment
Не могли бы вы подробнее рассказать о том, как выглядит ваше приложение?   -  person geoand    schedule 07.05.2019
comment
@geo и я расширил вопрос.   -  person Christoph Grimmer-Dietrich    schedule 07.05.2019
comment
Простите мое незнание, но я почти уверен, что JSON-B используется по умолчанию в Quarkus вместо Jackson, поэтому я спрашиваю, как у вас все настроено.   -  person geoand    schedule 07.05.2019
comment
Хм ... может я невежественный. Quarkus-bom содержит управление депо для Джексона, поэтому я предполагал, что он использует Джексона для обеспечения привязки. Если это не так (что вполне возможно), мой вопрос может быть следующим: Как демаршалировать / десериализовать / привязать / duh JSON к классам данных Kotlin :-D   -  person Christoph Grimmer-Dietrich    schedule 07.05.2019
comment
Я думаю, что Джексон используется для XML, но опять же я не уверен. Не уверен, как JSON-B будет использоваться для обработки классов данных Kotlin, определенно что-то, на что стоит обратить внимание :)   -  person geoand    schedule 07.05.2019


Ответы (2)


Вы можете попробовать добавить аннотацию @JsonbCreator к классам модели запроса. Итак, в этом случае JSON-B попытается использовать конструктор для создания ваших объектов вместо no-args / Reflection.

Например:

data class MyRequest @JsonbCreator constructor(
    @JsonbProperty("propertyOne") val propertyOne: String,
    @JsonbProperty("propertyTwo") val propertyTwo: : String
)
person Vinicius Costa    schedule 20.05.2019
comment
Даже если это сработает (еще не пробовал), нам все равно придется вручную аннотировать каждый класс. Я хочу определить для этого глобальное поведение. - person Christoph Grimmer-Dietrich; 21.05.2019

Согласно документации, вы должны зарегистрировать реализацию ( quarkus) интерфейс ObjectMapperCustomizer.

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.KotlinModule
import io.quarkus.jackson.ObjectMapperCustomizer
import javax.inject.Singleton

@Singleton
class AddKotlinModuleCustomizer : ObjectMapperCustomizer {

    override fun customize(objectMapper: ObjectMapper) {
        objectMapper.registerModule(KotlinModule())
    }
}

И, конечно же, добавьте модуль kotlin в качестве зависимости в pom

    <dependency>
      <groupId>com.fasterxml.jackson.module</groupId>
      <artifactId>jackson-module-kotlin</artifactId>
      <version>2.10.2</version>
    </dependency>
person kocka    schedule 16.02.2020
comment
В quarkus это не сработает при развертывании AWS Lambda, поскольку при исходной компиляции выдает ошибку. Но собственное развертывание для настольных компьютеров или jar-файлов будет работать безупречно. - person privatejava; 14.07.2020