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