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();
    }

Вот объяснение того, как установить глобальные заголовки:

Пример кода здесь:

Другие вопросы по тегам