java OpenApi规范生成器-为String字段提供来自多个Enum类的值

0lvr5msh  于 2023-02-20  发布在  Java
关注(0)|答案(1)|浏览(243)

我正在用Kotlin编写一个Spring Boot应用程序,目前正在努力为一个DTO类生成一个规范,该DTO类具有一个类型为String的支持字段,我希望稍后将其解析为适配器层中的两个枚举类之一。
我已经尝试了使用oneOf Annotation值的以下方法,看起来它做了我想要的事情:

data class MyDto(
    @Schema(
        type = "string",
        oneOf = [MyFirstEnum::class, MySecondEnum::class]
    )
    val identifier: String,
    val someOtherField: String
) {
    fun transform() { ... } // this will use the string identifier to pick the correct enum type later
}

这将产生以下OpenApi规范:

"MyDto": {
    "required": [
        "someOtherField",
        "identifier"
    ],
    "type": "object",
    "properties": {
        "identifier": {
            "type": "object",    // <--- this should be string
            "oneOf": [{
                    "type": "string",
                    "enum": [
                        "FirstEnumValue1",
                        "FirstEnumValue2",
                        "FirstEnumValue3"
                    ]
                }, {
                    "type": "string",
                    "enum": [
                        "SecondEnumValue1",
                        "SecondEnumValue2",
                        "SecondEnumValue3"
                    ]
                }
            ]
        },
        "someOtherField": {
            "type": "string"
        }
    }
}

正如您所看到的,枚举常量(我认为)正确地内联到了规范中,但是字段上的type注解(我将其设置为string)被忽略了,从而导致object类型,我认为在本例中该类型是不正确的。
我的问题是:

  • 使用object声明而不是string声明,我的当前代码和结果规范是否有效?
  • 有没有更好的方法将枚举值嵌入到规范中?
    • 编辑以添加:**我正在结合使用Spring Boot v2.7.8和springdoc-openapi v1.6.13来自动生成OpenApi规范。
s3fp2yjn

s3fp2yjn1#

我在问题中展示的基于注解的方法似乎无法生成有效的springdoc-openapi:1.6.13 OpenApi规范,正如Helen在注解中提到的,字段identifier的类型必须是String。
我能够通过使用GlobalOpenApiCustomizer Bean手动创建这个特定类的Schema来解决这个问题:

@Bean
fun myDtoCustomizer(): GlobalOpenApiCustomizer {
    val firstEnum = StringSchema()
    firstEnum.description = "First Enum"
    MyFirstEnum.values().forEach { firstEnum.addEnumItem(it.name) }

    val secondEnum = StringSchema()
    secondEnum.description = "Second Enum"
    MySecondEnum.values().forEach { secondEnum.addEnumItem(it.name) }

    return GlobalOpenApiCustomizer {
        it.components.schemas[MyDto::class.simpleName] = ObjectSchema()
            .addProperty(
                MyDto::identifier.name,
                StringSchema().oneOf(
                    listOf(
                        firstEnum,
                        secondEnum
                    )
                )
            )
            .addProperty(MyDto::someOtherField.name, StringSchema())
    }
}

这又会产生以下规范:

"MyDto": {
    "type": "object",
    "properties": {
        "identifier": {
            "type": "string",
            "oneOf": [{
                    "type": "string",
                    "description": "First Enum",
                    "enum": [
                        "FirstEnumValue1",
                        "FirstEnumValue2",
                        "FirstEnumValue3"
                    ]
                }, {
                    "type": "string",
                    "description": "Second Enum",
                    "enum": [
                        "SecondEnumValue1",
                        "SecondEnumValue2",
                        "SecondEnumValue3"
                    ]
                }
            ]
        },
        "someOtherField": {
            "type": "string"
        }
    }
}

相关问题