Как настроить сериализацию micronaut для работы с моделями, созданными с помощью открытого API?

Описание проблемы. У меня есть проект, в котором я создаю RESTful api с помощью micronaut. Модели, возвращаемые в теле ответа, генерируются из открытой спецификации API (с использованием плагина gradle).

Однако по какой-то причине micronaut всегда возвращает любой объект модели как пустой объект json {}, даже если он должен быть заполненным объектом.

Ссылка на репозиторий https://gitlab.com/connorbutch/open-api-micronaut-quarkus

Примеры вывода

Ожидал:

[
     {
           "id": 123
           "name": "Scruffy"
           "tag": "Chuck's pup"

     }
]

Фактически: [{}]

Как воспроизвести

  • Клонировать код локально (git clone ....)
  • Перейдите в корневой каталог (cd .......)
  • Запустите сборку gradle (чистая сборка gradle)
  • Перейдите к чтению-понимания-сервер-имп (cd-чтение-понимание-сервер-имп)
  • Запустите docker build (либо docker build. -T ...., либо просто запустите ./docker-build.sh) ‹- этот шаг займет немного времени и памяти, поэтому потенциально закройте другие приложения
  • Запустите только что созданный образ докера (docker run -p 8080: 8080 read-compgotiion-server-impl)
  • Сделайте запрос на получение на сервер (http: // localhost: 8080 / pets? Limit = 4)

У меня есть идеи, которые меня интересовали:

  • может ли это быть проблемой (gradle) области? Должен ли я использовать api вместо реализации для аннотации @Introspected (просто чтобы посмотреть, работает ли она)?
  • могло ли это быть проблемой с моделью, созданной в другом модуле / банке? Должен ли я перенести поколение в тот же проект (просто чтобы посмотреть, работает ли оно)?
  • Может ли это быть проблемой с разными версиями микронавтов в разных модулях?
  • Могу ли я каким-то образом ввести (или иначе) получить ссылку на сериализатор bean-компонентов для дальнейшей отладки?

Другие исследования

  • Я изменил одну из конечных точек, чтобы она возвращала объектную модель из того же модуля (просто фиктивный ответ), и она была возвращена в правильном формате .... так что это может быть либо проблема версии, либо проблема сборки (поскольку она находится в другой модуль)
  • Я модифицировал включенный модуль, чтобы использовать ту же версию micronaut (на данный момент 1.3.0, в будущем хотел бы перейти на 2.x.x), но все еще не сериализуется правильно
  • Я создал копию класса, который пытался сериализовать в теле ответа в этот модуль, и это сработало (см. NotARealPet.java). Теперь вопрос в том, могу ли я настроить это для работы или мне просто (временно) изменить api для создания в каталоге сборки этого проекта?

person Connor Butch    schedule 12.08.2020    source источник


Ответы (1)


Я нашел ответ. Даже если класс скомпилирован с @Introspected, graal vm (native-image cli) не смотрит на эти классы. Чтобы включить их, я в конечном итоге включил класс, определяющий интроспекцию этих классов @Introspected (classes = {Pet.class, Error.class})

Если кому интересно, выложу ссылку на gitlab с примерами

person Connor Butch    schedule 12.08.2020