OpenAPI Generator(jaxrs-spec)生成的AllOf枚举类无值问题求助
问题
我创建了一个包含枚举值对象的OpenAPI规范,部分接口需要支持所有枚举值,于是尝试用allOf引用多个枚举对象,但没生效。生成的EnumObject类不包含任何枚举值,而EnumObjectA和EnumObjectB能正常生成对应的枚举值。以下是我的OpenAPI规范代码和openapi-generator-maven-plugin配置,想问问是这个特性不支持还是我配置漏了?
openapi: 3.0.3 info: title: Test spec for StackOverflow version: 1.0.0 paths: /status: get: tags: - Test summary: Test summary description: 'Test description' operationId: testOperationId responses: '200': description: Successful operation content: application/json: schema: $ref: '#/components/schemas/TestResponse' components: schemas: TestResponse: type: object properties: stringId: type: string enumObject: $ref: '#/components/schemas/EnumObject' EnumObject: allOf: - $ref: '#/components/schemas/EnumObjectA' - $ref: '#/components/schemas/EnumObjectB' EnumObjectA: type: string description: Enum object A enum: - VALUE_A1 - VALUE_A2 EnumObjectB: type: string description: Enum object B enum: - VALUE_B1 - VALUE_B2 - VALUE_B3
<configuration> <inputSpec>${project.basedir}/src/main/resources/openapi/rest.yaml</inputSpec> <generatorName>jaxrs-spec</generatorName> <configOptions> <dateLibrary>java8</dateLibrary> <interfaceOnly>true</interfaceOnly> <useTags>true</useTags> </configOptions> <generateApiTests>false</generateApiTests> <generateApiDocumentation>false</generateApiDocumentation> <generateModelTests>false</generateModelTests> <generateModelDocumentation>false</generateModelDocumentation> <generateSupportingFiles>false</generateSupportingFiles> <ignoreFileOverride>${project.basedir}/src/main/resources/.openapi-codegen-ignore</ignoreFileOverride> </configuration>
解决方案
这不是配置遗漏,而是你对allOf在枚举场景下的作用理解有误:
allOf对字符串枚举的语义是交集,即同时满足所有引用枚举的取值。你的EnumObjectA和EnumObjectB没有共同的枚举值,所以生成的EnumObject自然没有可用值。- 如果你需要让
EnumObject支持两个枚举的所有取值(即并集),不能用allOf,而是直接合并枚举值,或者用oneOf(语义为取任意一个枚举的取值,和“包含所有值”略有区别)。
修改后的OpenAPI规范示例(合并枚举值)
openapi: 3.0.3 info: title: Test spec for StackOverflow version: 1.0.0 paths: /status: get: tags: - Test summary: Test summary description: 'Test description' operationId: testOperationId responses: '200': description: Successful operation content: application/json: schema: $ref: '#/components/schemas/TestResponse' components: schemas: TestResponse: type: object properties: stringId: type: string enumObject: $ref: '#/components/schemas/EnumObject' EnumObject: type: string description: 合并所有枚举值 enum: - VALUE_A1 - VALUE_A2 - VALUE_B1 - VALUE_B2 - VALUE_B3 EnumObjectA: type: string description: Enum object A enum: - VALUE_A1 - VALUE_A2 EnumObjectB: type: string description: Enum object B enum: - VALUE_B1 - VALUE_B2 - VALUE_B3
可选方案(用oneOf,语义为取任意一个枚举的取值)
如果你希望enumObject可以是EnumObjectA或EnumObjectB的任意值,可以用oneOf替代allOf,生成的代码会以继承/多态方式处理:
EnumObject: oneOf: - $ref: '#/components/schemas/EnumObjectA' - $ref: '#/components/schemas/EnumObjectB'
当前版本的jaxrs-spec生成器对allOf处理枚举的场景确实不会生成合并后的枚举,因为这不符合JSON Schema中allOf的语义,你需要根据实际需求选择上述方案之一。
内容的提问来源于stack exchange,提问作者Danny Gloudemans
相关产品推荐
相关产品推荐

