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;
}