Класс ответа по умолчанию в Springdoc
Я пытаюсь добавить модель ошибок по умолчанию для всех конечных точек в моем API для некоторых кодов ошибок.
Я нашел частичное решение, прочитав следующие вопросы:
- Springfox -> Springdoc: как выставлять дополнительные модели
- https://github.com/springdoc/springdoc-openapi/issues/381
Это bean-компонент, который я создаю для этой настройки:
@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. Выпуск
- springdoc-openapi-ui => 1.3.0
- springdoc-openapi-security => 1.3.0
1 ответ
У меня была похожая проблема, и я решил ее сегодня:
Для начала нужно добавить в компоненты все 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));
Затем вам нужно создать Schema-Ref, чтобы использовать его в своем ответе:
// 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.