Автоматическая генерация клиентской модели на основе документа open api 3.0 на стороне сервера не производит эквивалент родительского класса orm на стороне сервера.
Я разрабатываю новый сервер акведука и хочу иметь клиент браузерамодель автоматически генерируется из серверной модели.Я создал класс модели LanguageLevel и класс модели LanguageLesson, где у LanguageLevel много LanguageLesson.Я создал два соответствующих контроллера и операции getAllLevels, createLanguageLevel и getAllLessons соответственно.Затем я создал файл миграции, а также файл документа open api 3.0.Я использовал утилиту генерирования open api для создания библиотеки на стороне клиента.
Это для CLI акведука и версии проекта 3.1.0 + 1.Результат ниже был таким же для версии 3.0.2.Для генерации клиентской модели использовался openapi-generator-cli-3.3.4.
Сторона сервера
класс LanguageLevel расширяет ManagedObject <_LanguageLevel> реализует _LanguageLevel {}
класс _LanguageLevel {
@primaryKey
int pk;
@Column(unique: true)
int sequence;
ManagedSet<LanguageLesson> languageLessons;
}
класс LanguageLesson расширяет ManagedObject <_LanguageLesson> реализует _LanguageLesson {}
класс _LanguageLesson {
@primaryKey
int pk;
@Column()
int sequence;
@Relate(#languageLessons)
LanguageLevel languageLevel;
}
открыть api 3.0 с помощью команды: документ акведука
{"openapi": "3.0.0", "info": {"title": "back_end", "description": "Seven Arabic Server.", "версия": "0.0.1"}, "серверы": [{"url": "http://localhost:8888"}]," пути ": {" / level ": {" параметры ": [],"get": {"tags": ["Levels"], "operationId": "getAllLevels", "parameters": [{"name": "sequence", "in": "query", "required": false, "allowEmptyValue": false, "schema": {"type": "integer"}}], "answers": {"200": {"description": "Успешный ответ."}}}, "post":{"tags": ["Levels"], "operationId": "createLanguageLevel", "параметры ": []," requestBody ": {" required ": true," content ": {" application / json ": {" schema ": {" $ ref ":" # / components / schemas / LanguageLevel "}}}}, "response": {"200": {"description": "Успешный ответ."}}}}, "/ level / {sequence}": {"parameters": [{"name": "sequence", "in": "путь", "обязательный": истина, "схема": {"тип": "строка"}}]}, "/ уроки": {"параметры": [], "получить": {"tags": ["Lessons"], "operationId": "getAllLessons", "parameters": [{"name": "id", "in": "query", "required": false, "allowEmptyValue":false, "схема": {"тип": "целое число"}}], "ответы": {"200": {"описание": "успешный ответ."}}}}, "/ уроки / {идентификатор}": {"parameters": [{"name": "id", "in": "path", "required": true, "schema": {"тип": "строка"}}]}, "/ пример": {"параметры": []}}, "компоненты": {"schemas": {"LanguageLesson": {"title": "LanguageLesson","type": "object", "properties": {"pk": {"title": "pk", "type": "integer", "description": "Это основной идентификатор для этого объекта. \ n"," nullable ": false}," sequence ": {" title ":" sequence "," type ":" integer "," nullable ": false}," languageLevel ": {" title ":" languageLevel ","type": "object", "properties": {"pk": {"type": "integer"}}}}, "description": ""}, "LanguageLevel": {"title": "LanguageLevel", "type": "object", "properties": {"pk": {"title": "pk", "type": "integer", "description": "Это основной идентификатор этого объекта. \n "," nullable ": false}," sequence ": {" title ":" sequence "," type ":" integer "," description ":" Никакие два объекта не могут иметь одинаковое значение для этого поля. \ n"," nullable ": false}," languageLessons ": {" type ":" array "," items ": {" $ ref ":" # / components / schemas / LanguageLesson "}," nullable ": true,"доступен только для чтения ":true}}, "description": ""}}, "response": {}, "parameters": {}, "requestBodies": {}, "headers": {}, "securitySchemes": {}, "callbacks": {}}}
Обратите внимание, что languageLevel определен как тип объекта только со свойством" pk ", а LanguageLevel определен как тип объекта с" pk "," sequence "и" languageLessons ".Извлеченные из спецификации они выглядят так:
"languageLevel": {
"title": "languageLevel",
"type": "object",
"properties": {
"pk": {
"type": "integer"
}
}
}
и
"LanguageLevel": {
"title": "LanguageLevel",
"type": "object",
"properties": {
"pk": {
"title": "pk",
"type": "integer",
"description": "This is the primary identifier for this object.\n",
"nullable": false
},
"sequence": {
"title": "sequence",
"type": "integer",
"description": "No two objects may have the same value for this field.\n",
"nullable": false
},
"languageLessons": {
"type": "array",
"items": {
"$ref": "#/components/schemas/LanguageLesson"
},
"nullable": true,
"readOnly": true
}
},
"description": ""
}
Модель с открытым клиентским интерфейсом, созданная API (показан только LanguageLevel)
class LanguageLevel {
int pk = null;
LanguageLevel();
@override
String toString() {
return 'LanguageLevel[pk=$pk, ]';
}
LanguageLevel.fromJson(Map<String, dynamic> json) {
if (json == null) return;
pk = json['pk'];
}
Map<String, dynamic> toJson() {
return {
'pk': pk
};
}
static List<LanguageLevel> listFromJson(List<dynamic> json) {
return json == null ? new List<LanguageLevel>() : json.map((value) =>
new LanguageLevel.fromJson(value)).toList();
}
static Map<String, LanguageLevel> mapFromJson(Map<String, dynamic> json) {
var map = new Map<String, LanguageLevel>();
if (json != null && json.length > 0) {
json.forEach((String key, dynamic value) => map[key] = new
LanguageLevel.fromJson(value));
}
return map;
}
}
Помимо всего необходимого кода, он также создал классы моделей LanguageLevel и LanguageLesson.Модель LanguageLesson выглядит хорошо, так как имеет ожидаемые свойства и ссылку на LanguageLevel.Однако LanguageLevel имеет только @primarykey-эквивалент модели на стороне сервера.Поэтому сейчас нет способа отобразить объекты LanguageLevel из сгенерированного кода.Я ожидал, что смогу сделать это на этом этапе.