Springdoc GroupedOpenApi не соответствует глобальным параметрам, установленным с помощью OperationCustomizer

Когда используешь GroupedOpenApiЧтобы определить группу API, общий набор параметров, которые добавляются к каждой конечной точке, не присутствует в списке параметров. Ниже приведены соответствующие коды

@Bean
public GroupedOpenApi v1Apis() {
    return GroupedOpenApi.builder().group("v1 APIs")
            // hide all v2 APIs
            .pathsToExclude("/api/v2/**", "/v2/**")
            // show all v1 APIs
            .pathsToMatch("/api/v1/**", "/v1/**")
            .build();
}

И класс для добавления стандартных заголовков ко всем конечным точкам

@Component
public class GlobalHeaderAdder implements OperationCustomizer {
    @Override
    public Operation customize(Operation operation, HandlerMethod handlerMethod) {
        operation.addParametersItem(new Parameter().$ref("#/components/parameters/ClientID"));
        operation.addSecurityItem(new SecurityRequirement().addList("Authorization"));
        List<Parameter> parameterList = operation.getParameters();
        if (parameterList!=null && !parameterList.isEmpty()) {
            Collections.rotate(parameterList, 1);
        }
        return operation;
    }
}

Фактический выход

Ожидаемый результат

Чтобы воспроизвести проблему, клонируйте https://github.com/debargharoy/springdoc-test

Обходной путь

Добавление путей, которые должны быть включены / исключены в файле свойств приложения, решает ошибку. Но что-то на уровне кода будет очень оценено.

2 ответа

Решение

Прикрепите необходимые OperationCustomizerобъект при построении Api Group.

@Bean
public GroupedOpenApi v1Apis() {
    return GroupedOpenApi.builder().group("v1 APIs")
            // hide all v2 APIs
            .pathsToExclude("/api/v2/**", "/v2/**")
            // show all v1 APIs
            .pathsToMatch("/api/v1/**", "/v1/**")
            .addOperationCustomizer(new GlobalHeaderAdder()) 
            .build();
}

Альтернатива для добавления и загрузки OperationCustomizer в случае, если вы объявляете свои открытые группы API по свойствамspringdoc.group-configs[0].group=вместо определения кодом Java в конфигурации SpringGroupedOpenApi.builder().

        @Bean
  public Map<String, GroupedOpenApi> configureGroupedsOpenApi(Map<String, GroupedOpenApi> groupedsOpenApi, OperationCustomizer operationCustomizer) {
    groupedsOpenApi.forEach((id, groupedOpenApi) -> groupedOpenApi.getOperationCustomizers()
                                                                  .add(operationCustomizer));
    return groupedsOpenApi;
  }
Другие вопросы по тегам