Springdoc GroupedOpenApi 不遵循使用 OperationCustomizer 设置的全局参数

Posted

技术标签:

【中文标题】Springdoc GroupedOpenApi 不遵循使用 OperationCustomizer 设置的全局参数【英文标题】:Springdoc GroupedOpenApi not following global parameters set with OperationCustomizer 【发布时间】:2020-10-28 17:48:20 【问题描述】:

使用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

解决方法

在应用程序属性文件中添加要包含/排除的路径可以解决错误。但是代码级别的东西将不胜感激。

【问题讨论】:

【参考方案1】:

在构建 Api Group 时附加所需的OperationCustomizerobject。

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

编辑:参考@Value not providing values from application properties Spring Boot更新答案

【讨论】:

完全同意答案

以上是关于Springdoc GroupedOpenApi 不遵循使用 OperationCustomizer 设置的全局参数的主要内容,如果未能解决你的问题,请参考以下文章

Springfox与SpringDoc——swagger如何选择(SpringDoc入门)

springdoc中的默认响应类

SpringDoc (spring boot) utf-8 json 标头响应文档

springdoc-openapi 应用默认全局 SecurityScheme 可能吗?

使用泛型继承的springdoc-openapi规范生成

我们可以在 Springdoc 中用 redoc 替换 swagger-ui