【问题标题】:How can I make optional OpenAPI parameters nullable using springdoc-openapi?如何使用 springdoc-openapi 使可选的 OpenAPI 参数为空?
【发布时间】:2021-09-24 14:39:57
【问题描述】:

springdoc-openapi 库会在生成的 OpenAPI 文档中自动将某些属性标记为 required。例如,注释为 @NotNull 的属性将包含在生成的 YAML 文件的必需属性列表中。

库不做的一件事是将可选属性标记为nullable: true。但是,默认情况下,Spring Boot 应用程序将在请求中接受 null 并在可选属性的响应中返回 null。这意味着 OpenAPI 文档和端点的行为之间存在差异。

手动将任何单个属性标记为可以为空是微不足道的:只需将@Schema(nullable = true) 添加到字段或访问器即可。但是,在具有多个属性的大型模型中,我宁愿以与required 属性相同的方式自动确定它。也就是说,如果不需要该属性,我希望它是nullable,反之亦然。

如何在 springdoc-openapi 生成的 OpenAPI 文档中将我的可选属性标记为 nullable: true

示例

import io.swagger.v3.oas.annotations.media.Schema;
import javax.validation.constraints.NotNull;

public class RequiredExample {
    @NotNull
    private String key;

    private String value;

    public String getKey() { return key; }
    public void setKey(String key) { this.key = key; }
    public String getValue() { return value; }
    public void setValue(String value) { this.value = value; }
}

生成的 OpenAPI 文档:

"components": {
  "schemas": {
    "RequiredExample": {
      "required": [
        "key"
      ],
      "type": "object",
      "properties": {
        "key": {
          "type": "string"
        },
        "value": {
          "type": "string"
        }
      }
    }
  }
}

所需的 OpenAPI 文档:

"components": {
  "schemas": {
    "RequiredExample": {
      "required": [
        "key"
      ],
      "type": "object",
      "properties": {
        "key": {
          "type": "string"
        },
        "value": {
          "type": "string"
          "nullable": true
        }
      }
    }
  }
}

【问题讨论】:

  • 我也有同样的问题。你找到解决办法了吗?你也知道为什么 "nullable": true 没有被设为可选属性的默认值吗?
  • @Snackoverflow 我没有找到任何内置的东西,所以我一直在使用OpenApiCustomizer 方法。而且我不知道他们为什么决定让事物默认为空。
  • 这对 Kotlin 来说特别有趣,因为你有明确的可空或不可空类型。事实证明,如果你有一个可为空的属性,那么 springdoc-openapi 使它成为可选的(不是必需的)但仍然不能为空。因此,根据架构,您可以从 JSON 中省略该属性,但您可能没有它的值 null。到目前为止,我仍然不确定这是有意的还是错误的。网上还真没找到解释。

标签: java spring spring-boot openapi springdoc


【解决方案1】:

一种解决方案是创建一个 springdoc-openapi OpenApiCustomiser Spring bean,它将所有属性设置为 nullable,除非它们在 required 属性列表中。这种方法受益于对@NotNull 和其他此类注释的内置springdoc-openapi 支持,因为required 属性将根据此类属性的存在以标准方式计算。

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.media.Schema;
import org.springdoc.core.customizers.OpenApiCustomiser;
import org.springframework.stereotype.Component;
import java.util.Map;

@Component
public class NullableIfNotRequiredOpenApiCustomizer implements OpenApiCustomiser {
    @Override
    @SuppressWarnings({"rawtypes", "unchecked"})
    public void customise(OpenAPI openApi) {
        for (Schema schema : openApi.getComponents().getSchemas().values()) {
            if (schema.getProperties() == null) {
                continue;
            }

            ((Map<String, Schema>) schema.getProperties()).forEach((String name, Schema value) -> {
                if (schema.getRequired() == null || !schema.getRequired().contains(name)) {
                    value.setNullable(true);
                }
            });
        }
    }
}

【讨论】:

  • 请注意,您应该以不同的方式处理ComposedSchema 类型。例如,如果您的架构有一个 allOf 属性,其中包含一个对象,则该嵌套对象的属性也应该被处理。上面的代码没有这样做,只是跳过它们,因为它们的getProperties() 将返回null
  • @Snackoverflow 这很可能是真的,当我有机会时,我将不得不玩弄一些东西。我的代码目前没有使用ComposedSchema,所以我自己没有遇到过。
猜你喜欢
  • 2020-06-25
  • 2021-11-14
  • 2020-10-02
  • 2020-12-07
  • 2020-10-22
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
相关资源
最近更新 更多