Spring Boot 如何注入一个自定义头每当一个请求是从 Swagger 用户界面发送?

bt1cpqcv  于 2023-03-08  发布在  Spring
关注(0)|答案(1)|浏览(196)

我有一个情况,当我想硬编码一个名为test-header的请求头,它将存储简单的JSON数据{"username":"swagger", "email":"dummy@email"}。因此,使用Swagger UI发出请求的用户将不需要手动添加此数据,它将自动添加到从Swagger UI发送的每个请求中。
我使用的是带有Sping Boot v3的org.springdoc,目前我只有简单的OpenAPI bean:

@Bean
public OpenAPI customOpenAPI(@Value("${springdoc.version}") String appVersion) {
    return new OpenAPI()
            .info(new Info().title("Person API").version(appVersion)
                    .license(new License().name("Apache 2.0").url("http://springdoc.org")));
};

有没有可能以某种方式把它添加到它里面?或者我注定要使用过滤器/拦截器?

pgky5nke

pgky5nke1#

是的,可以通过Swagger UI传递一个带有默认值的自定义头。您可以使用下面的代码片段来自定义OpenAPI-

@Bean
public OpenApiCustomizer getCustomizer() {
    ObjectSchema myCustomSchema = new ObjectSchema();
    myCustomSchema.addProperty("username", new Schema<>().type("string")._default("swagger"));
    myCustomSchema.addProperty("email", new Schema<>().type("string")._default("dummy@email"));

    return openApi -> openApi.getPaths().values().stream()
            .flatMap(pathItem -> pathItem.readOperations().stream())
            .forEach(operation -> 
                operation.addParametersItem(
                        new HeaderParameter()
                                .name("test-header")
                                .required(false)
                                .schema(myCustomSchema).explode(true)
                                .style(Parameter.StyleEnum.SIMPLE)
                )
            );
}

这将在控制器中生成标题的值username = swagger,email = dummy@email
但是我建议如果你必须把JSON作为头文件来传递,那么就用字符串化的方式传递它,然后把它解析成控制器中的一个对象。

@Bean
public OpenApiCustomizer getCustomizer() {
    return openApi -> openApi.getPaths().values().stream()
            .flatMap(pathItem -> pathItem.readOperations().stream())
            .forEach(operation -> operation
                    .addParametersItem(
                            new HeaderParameter()
                                    .name("test-header")
                                    .required(false)
                                    .schema(new Schema().type("string")._default("{\"username\":\"swagger\", \"email\":\"dummy@email\"}"))
                    ));
}

如果有帮助请投赞成票。

相关问题