мы используем первый подход 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-аннотации при построении схем / моделей.