Обязательный заголовок для всех API в openapi 3.0 - PullRequest
0 голосов
/ 30 января 2020

Я использую OpenAPI 3.0 с Spring-boot 5 и, следовательно, не имею конфигурации YAML. У меня есть заголовок, который содержит идентификатор клиента (это не заголовок аутентификации). Я хочу сделать это обязательным параметром заголовка. Добавленная ниже конфигурация OpenAPI

@Configuration
public class OpenAPIConfiguration {
    @Bean
    public OpenAPI customOpenAPI() {

        return new OpenAPI()
                .components(new Components()
                        .addParameters("myCustomHeader", new Parameter().in("header").schema(new StringSchema()).required(true).description("myCustomHeader").name("myCustomHeader")))
                .info(new Info()
                        .title("My Rest Application")
                        .version("1.2.26"));
    }
}

Однако пользовательский интерфейс сваггера не показывает требуемый параметр ни в одном API. Может кто-нибудь помочь с тем, что я делаю неправильно?

enter image description here

1 Ответ

4 голосов
/ 30 января 2020

Добавление определения параметра к пользовательскому компоненту OpenAPI не будет работать, поскольку параметр не будет распространен на определения операций. Вы можете достичь своей цели, используя OperationCustomizer :

    @Bean
    public OperationCustomizer customize() {
        return (operation, handlerMethod) -> operation.addParametersItem(
                new Parameter()
                        .in("header")
                        .required(true)
                        .description("myCustomHeader")
                        .name("myCustomHeader"));
    }

Интерфейс OperationCustomizer был представлен в springdo c -openapi 1.2.22. В предыдущих версиях вам нужно было использовать OpenApiCustomiser :

@Component
public class MyOpenApiCustomizer implements OpenApiCustomiser {

    private static final List<Function<PathItem, Operation>> OPERATION_GETTERS = Arrays.asList(
            PathItem::getGet, PathItem::getPost, PathItem::getDelete, PathItem::getHead,
            PathItem::getOptions, PathItem::getPatch, PathItem::getPut);

    private Stream<Operation> getOperations(PathItem pathItem) {
        return OPERATION_GETTERS.stream()
                .map(getter -> getter.apply(pathItem))
                .filter(Objects::nonNull);
    }

    @Override
    public void customise(OpenAPI openApi) {
        openApi.getPaths().values().stream()
                .flatMap(this::getOperations)
                .forEach(this::customize);
    }

    private void customize(Operation operation) {
        operation.addParametersItem(
                new Parameter()
                        .in("header")
                        .required(true)
                        .description("myCustomHeader")
                        .name("myCustomHeader"));
    }
}
...