我已经创建了一个规范,其中包含具有枚举值的对象。有些方法应该支持所有的枚举值,因此我想把枚举对象作为allOf引用,但是这似乎不起作用。
在下面的示例中,EnumObject类不包含任何值,而EnumObjectA和EnumObjectB按预期工作。
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
我在openapi-generator-maven-plugin
中使用以下配置。如果不支持此功能,或者我错过了什么?
<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>
1条答案
按热度按时间nx7onnlm1#
对您的问题的简短回答是,确实不支持此功能。Another post建议使用
oneOf
作为替代方案,但这并不像您期望的那样真正适用于生成器。然而,我从来不是一个逃避挑战的人。所以,如果你对一个有趣的解决方案感兴趣,请继续阅读。
这个问题可以通过一些clever templating解决,或者更具体地说,使用供应商扩展。
这里的一个关键问题是生成器不能将
EnumObject
识别为枚举。尽管它是继承的,但创建的类是一个常规类,而不是枚举类。因此,当生成器进入model.mustache
并决定类应该是枚举类还是常规类时,它决定创建一个常规类。因此,让我们使用名为x-is-composite-enum
的供应商扩展来解决这个问题。像这样定义枚举对象
现在,向您的maven配置添加一个templates文件夹。
然后将
model.mustache
template复制到该文件夹中。现在将模板的第18行从
{{^isEnum}}{{>pojo}}{{/isEnum}}
更改为以下内容:它所做的是检查我们上面创建的供应商扩展。如果该扩展存在,它会告诉生成器使用
composite_enum.mustache
模板生成模型。如果没有,那么正常生成一个pojo。但是,目前
composite_enum.mustache
并不存在。别担心,让我们创造它。只需将
enumOuterClass.mustache
template复制到templates文件夹,并将其重命名为composite_enum.mustache
最后,将文件的第17行和第18行改为:
到这个
新生成的对象现在将拥有您的所有枚举