SpringDoc - Как программно добавлять схемы
Я использую SpringDoc и пытаюсь программно добавить схему в OpenApi, но безуспешно.
@Bean
public OpenAPI customOpenAPI() {
Schema mySchema = new Schema<Object>();
mySchema
.type("object")
.$ref("#/components/schemas/MySchema")
.name("MySchema")
.addProperties("testStr", new StringSchema());
return new OpenAPI()
.servers(servers)
.info(new Info().title(title).version(version).description(description))
.components(new Components()
.addSchemas("MySchema" , mySchema)
)
.tags(tags);
}
Описание mySchema не добавляется в список схем, которые я вижу в сгенерированном файле YAML, и если я попытаюсь ссылаться на него:
apiResponses.entrySet().forEach(response -> response.getValue().addHeaderObject("XxX",
new Header().$ref("#/components/schemas/MySchema")));
В пользовательском интерфейсе swagger отображается следующая ошибка:
Ошибка распознавателя в paths./XX/v1/test/status/{entry}.get.responses.404.headers.XxX.$ref Не удалось разрешить ссылку: не удалось разрешить указатель: /components/schemas/MySchema
Пожалуйста, не могли бы вы помочь мне понять?
Изменить: я использую версию 1.3.9
3 ответа
Похоже, ваша схема заменяется схемами, которые создаются автоматически. Попробуй это:
@Bean
public OpenApiCustomiser openApiCustomiser() {
return openApi -> {
var mySchema = new ObjectSchema();
mySchema.name("MySchema");
var schemas = openApi.getComponents().getSchemas();
schemas.put(mySchema.getName() , mySchema);
};
}
СGroupedOpenApi
установить черезComponents.addSchemas
:
@Bean
GroupedOpenApi api() {
return GroupedOpenApi.builder()
.group("REST API")
.addOpenApiCustomizer(openApi -> {
openApi.addSecurityItem(new SecurityRequirement().addList("Authorization"))
.components(new Components()
.addSchemas("User", ModelConverters.getInstance().readAllAsResolvedSchema(User.class).schema)
.addSchemas("UserTo", ModelConverters.getInstance().readAllAsResolvedSchema(UserTo.class).schema)
.addSecuritySchemes("Authorization", new SecurityScheme()
.in(SecurityScheme.In.HEADER)
.type(SecurityScheme.Type.HTTP)
.scheme("bearer")
.name("JWT"))
)
.info(new Info().title("REST API").version("1.0").description(...));
})
.pathsToMatch("/api/**")
.build();
}
Вот объяснение того, как установить глобальные заголовки:
Пример кода здесь: