Класс ответа по умолчанию в springdoc - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь добавить модель ошибок по умолчанию ко всем конечным точкам в моем API для некоторых кодов ошибок.

Я нашел частичное решение, прочитав следующие проблемы:

Это бин, который я создаю для этой настройки:

    @Bean
    public OpenApiCustomiser customOpenApiCustomiser() {
        return openApi -> {
            openApi.getPaths().values().forEach(pathItem -> pathItem.readOperations().forEach(operation -> {

                Schema sharedErrorSchema = ModelConverters.getInstance()
                        .read(Error.class)
                        .getOrDefault("Error", new Schema());

                MediaType sharedMediaType = new MediaType().schema(sharedErrorSchema);
                Content sharedContent = new Content()
                        .addMediaType(APPLICATION_JSON_VALUE, sharedMediaType);

                ApiResponses apiResponses = operation.getResponses();

                ApiResponse response = new ApiResponse()
                        .description("Unhandled server error")
                        .content(sharedContent);
                apiResponses.addApiResponse("500", response);
            }));
        };
    }

И мой класс Error выглядит примерно так:

public class Error {
    private String message;
    private List<ErrorItem> errorItems;
}

Проблема в том, что когда я открываю одно из определений конечных точек в swagger-ui, я получаю следующая ошибка:

Could not resolve reference: Could not resolve pointer: /components/schemas/ErrorItem does not exist in document

Как определить схему для ErrorItem, сделав ее доступной для swagger-ui?

Я использую:

  • Spring Boot => 2.2.4. Выпуск
  • springdo c -openapi-ui => 1.3.0
  • springdo c -openapi-security => 1,3 .0

1 Ответ

4 голосов
/ 27 апреля 2020

У меня была похожая проблема, и я решил ее сегодня:

Сначала вы должны добавить все java -типы к компонентам:

// add Error and ErrorItem to schema
openApi.getComponents().getSchemas().putAll(ModelConverters.getInstance().read(Error.class));
openApi.getComponents().getSchemas().putAll(ModelConverters.getInstance().read(ErrorItem.class));

Затем вы должны создать схему -Используйте его в своем ответе:

// add default responses
// Ref to Error-Object (added in step above)
Schema errorResponseSchema = new Schema();
errorResponseSchema.setName("Error");
errorResponseSchema.set$ref("#/components/schemas/Error");

Теперь вы можете использовать эту ссылку. В этом примере я использую Error только для BadRequest, все остальные ответы по умолчанию не используют схему. Измените его так, как вам нужно: -)

openApi.getPaths().values().forEach(pathItem -> pathItem.readOperations().forEach(operation -> {
  ApiResponses apiResponses = operation.getResponses();
  apiResponses.addApiResponse("400", createApiResponse("BadRequest", errorResponseSchema));
  apiResponses.addApiResponse("403", createApiResponse("Forbidden", null));
  apiResponses.addApiResponse("404", createApiResponse("Not Found", null));
  apiResponses.addApiResponse("500", createApiResponse("Server Error", null));
}));

Где createApiResponse - это простая частная функция:

private ApiResponse createApiResponse(String message, Schema schema) {
  MediaType mediaType = new MediaType();
  mediaType.schema(schema);
  return new ApiResponse().description(message)
                .content(new Content().addMediaType(org.springframework.http.MediaType.APPLICATION_JSON_VALUE, mediaType));
}

Убедитесь, что вы получаете правильный импорт для вашего Error.class, согласно по умолчанию это будет java .lang.Error.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...