Nano Hash - криптовалюты, майнинг, программирование

Как сгенерировать модели SpringBoot из Swagger yaml с помощью Openapi Generator

мы используем подход «сначала API», а API для наших сервисов определен в swagger yamls. Затем мы используем генератор Openapi для создания интерфейсов, которые должны быть реализованы микросервисами. Также модели генерируются из схем.

Вот тут и возникает вопрос. В одной из конечных точек REST я использую XML, пусть он будет проанализирован с помощью Spring-boot в модель, а затем сохранен в базе данных. На данный момент я использую модель, которая выглядит примерно так:

@Data
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@Document("MyModel")
public class Model {

  @Id 
  @XmlTransient
  private String id;

  @XmlAttribute
  private String someAttribute;

  @XmlElement("childName")
  private List<OtherModel> children;

  @XmlElement("otherChildName")
  private List<OtherModel2> children2; 

}

Остальные модели очень похожи. Мне это нравится, потому что Spring-boot может использовать это для автоматического анализа входящего XML, и я могу сохранить эту модель непосредственно в базе данных и вернуть ее как JSON.

В моделях, которые генерируются Openapi Generator, отсутствует аннотация, поэтому их нельзя использовать для синтаксического анализа XML и сохранить в базе данных. Есть ли способ в yaml добавить аннотации @Id, @Document и некоторые @Xml...?

Основная причина, по которой я пытаюсь сделать это (использовать автоматически сгенерированные модели в форме чванства), заключается в том, что это большая архитектура, где было бы неплохо, если бы кто-то изменил определение API в yaml и, например, добавил поля, которые микросервисы будут также будут построены снова, и модели будут обновлены без ручного обновления классов Java. Другой способ, о котором я думал, - это создание моделей, как это делает Openapi, затем расширение их собственными классами и последующее добавление аннотаций ... но я не могу придумать, как это сделать, чтобы вам не приходилось изменять производные class, если поле в определении изменяется.

Пример:

//class generated by openapigenerator
public class Model {
  private String field;
  private List<Submodel> children

  //autogenerated getters/setters
}

//model in my code
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@Document("MyModel")
public class MyModel extends Model {

  @Id 
  @XmlTransient
  @Getter
  @Setter
  private String id;

}

Это было бы нормально, но в некоторых полях не было бы @Xml... аннотаций. Я видел, что он отлично генерирует @JsonProperty("somename") name в случае именования json, но похоже, что использование свойств XML: name/attribute в yaml не влияет на сгенерированный java-код (или я делаю что-то не так, пытаясь это: Документация)

Единственное, что я мог придумать, - это @Override добавить геттеры / сеттеры и аннотировать их атрибутами, но это будет означать, что я должен коснуться каждого микросервиса, который использует производную модели, определенной API. Я не могу переместить производный класс в проект API, поскольку контексты (в данном случае XML / mongo) могут сильно различаться от микросервиса к микросервису.

Есть идеи о хорошем подходе к этому?

Ваше здоровье

----- РЕДАКТИРОВАТЬ ------

Покопавшись глубже, я становлюсь более уверенным, что, вероятно, правильный подход - добавить аннотации XML mappings (_10 _ / _ 11_) в swagger yaml, как это указано в документации, а затем расширить его в код микросервиса, чтобы добавить аннотации базы данных. В основном, как и во втором примере, только в том, что в базовом классе аннотации XML уже были бы сгенерированы кодогенерацией swagger. Однако мне еще не удалось заставить генерацию кода swagger генерировать какую-либо аннотацию XML при построении схем / моделей.


Ответы:


1

Итак, прежде всего, чтобы openapi сгенерировал XML-аннотации, вам необходимо установить флаг withXml на true в вашей конфигурации.

Я выбрал подход к использованию спецификации XML в файле openapi yaml для создания модели с аннотациями XML, которая используется Spring Boot для анализа входящего файла XML.

Затем, как и во втором примере, я создал другой класс и добавил аннотации id и базы данных.

Я считаю, что это хороший подход по двум причинам:

  1. Если openapi yaml изменен, например новые поля добавляются в XML или что-то подобное, код микросервиса не нужно изменять, чтобы отразить новые поля, только перестроить / повторно развернуть.
  2. Он отражает дифференциацию слоев, сгенерированная модель отражает то, что происходит на уровне Http, а производная модель отражает то, что необходимо на уровне базы данных.
12.03.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..