spring-boot - openapi 3.0 中所有 API 的强制 header

标签 spring-boot swagger swagger-ui openapi swagger-3.0

我在 Spring-boot 5 中使用 OpenAPI 3.0,因此没有配置 YAML。我有一个包含客户端标识 ID 的 header (这不是身份验证 header )。我想让它成为强制性的 header 参数。在 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"));
    }
}

但是,swagger UI 不会在任何 API 中显示所需的参数。有人可以帮助我做错什么吗?

enter image description here

最佳答案

将参数定义添加到自定义 OpenAPI bean 将不起作用,因为该参数不会传播到操作定义。您可以使用 OperationCustomizer 实现您的目标:

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

springdoc-openapi 1.2.22引入了OperationCustomizer接口(interface)。在以前的版本中,您需要使用 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"));
    }
}

关于spring-boot - openapi 3.0 中所有 API 的强制 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59981687/

相关文章:

java - Spring 中 ApplicationContext.getBean() 的替代方案

java - 使用 jar 中的@entity 时,Spring Data Jpa Repository 不工作

java - Swagger with Jersey 2 抛出 java.lang.NoClassDefFoundError : javax/servlet/ServletConfig

java - 无法使用 Springfox 发送授权承载 token

spring-boot - 使用外部配置部署 war

java - 如何从 Component 注入(inject) ApplicationContext?

java - Swagger 阅读器抛出 java.lang.NoSuchMethodError

java - 将自定义端点添加到 Spring Data REST 存储库并在 Swagger 中显示

java - 如何将 Java Swagger 注释转换为 Swagger json 模式?

java - 从现有 REST api 生成 Swagger 文档