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

мы используем первый подход API, а API для наших сервисов определяется в развязных словах. Затем мы используем генератор 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... аннотации?

Основная причина, по которой я пытаюсь это сделать (использовать автоматически генерируемые модели из swagger), заключается в том, что это более крупная архитектура, в которой было бы неплохо, если бы кто-то изменил определение API в yaml и, например, добавил поля microservice ( s) будет также построен снова, и модели будут обновлены без ручного обновления классов 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") имя очень хорошо в случае именования json, но кажется, что использование XML: name/attribute свойств в yaml не имеет никакого влияния на сгенерированный код Java (или я делаю что-то не так, пробуем это: Документация )

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

Есть какие-нибудь идеи относительно хорошего подхода для этого?

Приветствия

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

После более глубокого изучения я уверен, что, возможно, правильный подход - добавить аннотации сопоставлений XML (@XmlAttribute / @XmlElement) в swamger yaml, как это указано в документации, и затем расширить это в коде микросервиса, чтобы добавить аннотации базы данных. В основном, как и во втором примере, только то, что в базовом классе аннотации XML уже были бы созданы swagger codegen. Однако мне пока не удалось заставить swagger codegen генерировать какие-либо XML-аннотации при построении схем / моделей.

1 Ответ

1 голос
/ 12 марта 2019

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

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

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

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

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