java - Swagger-Codegen 不使用供应商扩展 x-discriminator-value

标签 java swagger openapi swagger-codegen

我正在尝试使用 swagger-codegen 为模式规范生成 Java API 客户端。 该架构使用供应商扩展x-discriminator-value来创建继承模型。

例如,我使用了我发现的模式规范:yaml here并转换为 json(我用“spec”根包装了结果,这样我就可以将结果发送到在线代码生成器,如下所述)。

当我尝试在本地或使用在线代码生成器生成 Java 客户端时,我发现未使用 x-discriminator-value 值完成反序列化。 相反,它是通过型号名称完成的。 我在生成的 JSON.java 文件中看到了这一点,其中包含从鉴别器到类的映射:

            classByDiscriminatorValue.put("PhoneSetting".toUpperCase(), PhoneSetting.class);
            classByDiscriminatorValue.put("SceneSetting".toUpperCase(), SceneSetting.class);
            classByDiscriminatorValue.put("TextSetting".toUpperCase(), TextSetting.class);

[要查看此内容,您可以将上述 json 发布https://generator.swagger.io/api/gen/clients/java 并检查 JSON.java 文件。

根据我的理解,我应该知道关键应该是 x-discriminator-value 值。例如,由于架构具有:

  "SceneSetting": {
      "description": "Scene Setting",
      "x-discriminator-value": "SCENE",
      "allOf": [
        {
          "$ref": "#/definitions/SectionSetting"
        }, 

那么我应该有一个映射

            classByDiscriminatorValue.put("SCENE".toUpperCase(), SceneSetting.class);

而不是 classByDiscriminatorValue.put("SceneSetting".toUpperCase(), SceneSetting.class);

如果您能就此事提供帮助,我将不胜感激。

最佳答案

我建议迁移到 OpenAPI 3.0 – 它内置了对 discriminator mapping 的支持。有OAS2-to-OAS3 converters以帮助迁移,但您必须手动更新映射。

在 OpenAPI 3.0 中,鉴别器映射在父架构中指定(而不是在子架构中)。为了便于阅读,以下示例采用 YAML 格式,您可以使用 https://www.json2yaml.com将其转换为 JSON。

openapi: 3.0.2

components:
  schemas:
    # Parent schema
    SectionSetting:
      type: object
      properties:
        ...
      discriminator:
        propertyName: PROP_NAME
        mapping:
          SCENE: SceneSetting
          ...

    # Child schema
    SceneSetting:
      description: Scene Setting
      allOf:
        - $ref: '#/components/schemas/SectionSetting'
        - ...

确保使用 Swagger Codegen 版本 3.x,因为 2.x 不支持 OpenAPI 3.0。您可以从 Maven Central 获取最新的 3.x CLI JAR:
https://mvnrepository.com/artifact/io.swagger.codegen.v3/swagger-codegen-cli

关于java - Swagger-Codegen 不使用供应商扩展 x-discriminator-value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59966963/

相关文章:

java - 如何在 Swagger Open API 3.0 规范中定义电子邮件格式?

java - liquibase 前置条件 sqlCheck 获取数据库名称

java - 如何使用 Java 中的通用方法来 CRUD MySQL 中的任何表,使用带有 Criteria 的 Hibernate,传递表名和/或字段作为参数?

java - Slick2D - 如何使用字体

java - Swagger-UI 无法识别 application/hal+json

java - org.springframework.beans.factory.UnsatisfiedDependencyException : Error creating bean with name 'documentationPluginsBootstrapper' defined

java - Swagger 启动 tomcat 时抛出 UncheckedExecutionException

java - OpenAPI/Swagger 构建具有多个相同键的对象

java - 没有 fromJson 和 toJson 方法的 openapi codegen

java - Superpowered:将效果应用于音频后,是否可以将输出缓冲区保存到文件中?