当前位置: 首页 > 知识库问答 >
问题:

openapi 3.0中所有API的必填标题

萧嘉茂
2023-03-14

我使用OpenAPI 3.0和Spring Boot5,因此没有配置YAML。我有一个包含客户端标识ID的标头(这不是一个身份验证标头)。我想把它作为一个强制性的标头参数。添加在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中显示所需的参数。有人能帮我解释一下我做错了什么吗?

共有1个答案

谭志用
2023-03-14

将参数定义添加到自定义的OpenAPIbean将不起作用,因为该参数不会传播到操作定义中。您可以使用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接口。在以前的版本中,您需要使用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(Swigger UI),我想知道如果我对所有API都使用相同的Java模型类,如何只为某些API指定某个字段是必需的/可选的。 这是我的样本: 这个类被用作几个API的输入请求,但只有其中一些API会要求这些字段都是必需的(即“密码”字段仅对登录API是必需的,而对注销API不是必需的)。 有没有一种方法可以使用OpenAPI的注释

  • 问题内容: 有没有更简单的功能,像这样: 问题答案: 像这样:

  • 我需要为搜索API定义Swagger/OpenAPI V3.0文件。我的请求可以指定地理空间坐标(经度和纬度)或(邮政编码和国家代码)或(城市和州和国家代码)。除了这些,我还有几个更强制的属性,比如距离和距离单位。 我知道如何在JSON模式中做到这一点 但我很难用大摇大摆的方式来定义它。OpenAPI3.0允许One of和anyOf构造,但如果我试图在required部分使用它,swagger

  • 问题内容: 我想用一个枚举的所有可能值来填充列表 自从我最近爱上了,我就利用了 是否有更好的方法 (如在未混淆的衬管中)达到相同的结果? 问题答案: 我不会在一开始使用List,因为EnumSet更合适,但是您可以 要么

  • 我试图添加一些填充的顶部和底部的一些文字和图标在一个卡片小部件。我发现flutter为容器提供了一种简单的方法,但似乎找不到其他小部件的方法(除了将它们包装在容器中)。这是我目前得到的代码: 因此,在我的子列中,我想在顶部和底部添加一些填充,而不必插入新的容器。这可能吗?