Как глобально игнорировать API Spring Boot из спецификации Open API 3? - PullRequest
0 голосов
/ 29 января 2020

Я просмотрел документацию: https://springdoc.github.io/springdoc-openapi-demos/faq.html#how -can-i-ignore-some-field-of-model- уже, но документы не очень четкие, у меня есть 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 (springdo c -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 Ответ

2 голосов
/ 29 января 2020

Вам просто нужно добавить описание OpenAPI того типа, который вам нужен o Позволяет поддерживать, что вы хотите, чтобы вернуть 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;
        }
    }
}
...