Как глобально игнорировать API Spring Boot из спецификации Open API 3?
Я просмотрел документацию: https://springdoc.github.io/springdoc-openapi-demos/faq.html уже, но документы не очень понятны, У меня есть проект реализации Spring Boot REST HATEOAS и использую спецификацию Open API 3 вместо Swagger.
Я реализовал разбиение на страницы для каждой конечной точки, но некоторые мои отраслевые стандарты ожидают, что контент будет иметь множественное число. Но поскольку это часть Pageable API, я не могу его переопределить, вместо этого я хочу его отключить. Любое предложение, как мы можем это сделать?
PageEmployeeOut:
type: object
properties:
totalElements:
type: integer
format: int64
totalPages:
type: integer
format: int32
size:
type: integer
format: int32
content:
type: array
items:
$ref: '#/components/schemas/EmployeeOut'
number:
type: integer
format: int32
sort:
$ref: '#/components/schemas/Sort'
numberOfElements:
type: integer
format: int32
first:
type: boolean
pageable:
$ref: '#/components/schemas/Pageable'
last:
type: boolean
empty:
type: boolean
Как и в Springfox Swagger, мы можем сделать, как показано ниже, что эквивалентно этому в Open API 3 (springdoc-openui)?
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.boot")))
.apis(RequestHandlerSelectors.basePackage("com.example"))
.paths(PathSelectors.any())
.build()
.apiInfo(apiInfo())
.useDefaultResponseMessages(false)
.ignoredParameterTypes(Pageable.class);
}
Это моя конечная точка
public ResponseEntity<Page<EmployeeDto>> findEmployees(@Parameter(hidden=true) Pageable pageable) {
Page<EmployeeDto> page = employeeService.findAllEmployees(page_params, pageable);
return new ResponseEntity<>(page, HttpStatus.OK);
}
1 ответ
Вам просто нужно добавить описание OpenAPI того типа, который вы хотите. Позволяет поддерживать, что вы хотите, вернуть EmployeeDto вместо Page
@ApiResponse(responseCode = "200", description = "successful operation", content = @Content(schema = @Schema(implementation = EmployeeDto.class)))
Если вам нужно заменить его глобально в вашем приложении, вы просто используете стандартный ModelConverter:
@Component
public class PageSupportConverter implements ModelConverter {
@Override
public Schema resolve(AnnotatedType type, ModelConverterContext context, Iterator<ModelConverter> chain) {
JavaType javaType = Json.mapper().constructType(type.getType());
if (javaType != null) {
Class<?> cls = javaType.getRawClass();
if (Page.class.isAssignableFrom(cls)) {
JavaType innerType = javaType.getBindings().getBoundType(0);
if (innerType.getBindings() != null && isResponseTypeWrapper(innerType.getRawClass())) {
type = new AnnotatedType(innerType).jsonViewAnnotation(type.getJsonViewAnnotation()).resolveAsRef(true);
return this.resolve(type, context, chain);
}
else {
type = new AnnotatedType(innerType).jsonViewAnnotation(type.getJsonViewAnnotation()).resolveAsRef(true);
}
}
}
if (chain.hasNext()) {
return chain.next().resolve(type, context, chain);
}
else {
return null;
}
}
}