java OpenAPI Generator(jaxrs-spec)为AllOf枚举对象生成单独的类

rbl8hiat  于 2023-05-12  发布在  Java
关注(0)|答案(1)|浏览(129)

我已经创建了一个规范,其中包含具有枚举值的对象。有些方法应该支持所有的枚举值,因此我想把枚举对象作为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>
nx7onnlm

nx7onnlm1#

对您的问题的简短回答是,确实不支持此功能。Another post建议使用oneOf作为替代方案,但这并不像您期望的那样真正适用于生成器。
然而,我从来不是一个逃避挑战的人。所以,如果你对一个有趣的解决方案感兴趣,请继续阅读。
这个问题可以通过一些clever templating解决,或者更具体地说,使用供应商扩展。
这里的一个关键问题是生成器不能将EnumObject识别为枚举。尽管它是继承的,但创建的类是一个常规类,而不是枚举类。因此,当生成器进入model.mustache并决定类应该是枚举类还是常规类时,它决定创建一个常规类。因此,让我们使用名为x-is-composite-enum的供应商扩展来解决这个问题。
像这样定义枚举对象

EnumObject:
  allOf:
    - $ref: '#/components/schemas/EnumObjectA'
    - $ref: '#/components/schemas/EnumObjectB'
  x-is-composite-enum: true

现在,向您的maven配置添加一个templates文件夹。

<configOptions>
  <templateDirectory>"$projectDir/src/main/resources/templates"</templateDirectory>
</configOptions>

然后将model.mustache template复制到该文件夹中。
现在将模板的第18行从{{^isEnum}}{{>pojo}}{{/isEnum}}更改为以下内容:

{{^isEnum}}{{#vendorExtensions.x-is-composite-enum}}{{>composite_enum}}{{/vendorExtensions.x-is-composite-enum}}{{^vendorExtensions.x-is-composite-enum}}{{>pojo}}{{/vendorExtensions.x-is-composite-enum}}{{/isEnum}}

它所做的是检查我们上面创建的供应商扩展。如果该扩展存在,它会告诉生成器使用composite_enum.mustache模板生成模型。如果没有,那么正常生成一个pojo。
但是,目前composite_enum.mustache并不存在。别担心,让我们创造它。
只需将enumOuterClass.mustache template复制到templates文件夹,并将其重命名为composite_enum.mustache
最后,将文件的第17行和第18行改为:

{{^gson}}
  {{#allowableValues}}{{#enumVars}}
  {{{name}}}({{{value}}}){{^-last}},
  {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}}
  {{/gson}}

到这个

{{^gson}}
  {{#composedSchemas}}{{#allOf}}{{#.}}{{#allowableValues}}{{#values}}
  {{{.}}}({{{.}}}){{^-last}},{{/-last}}{{/values}}{{/allowableValues}}{{^-last}},{{/-last}}{{/.}}{{#-last}};{{/-last}}{{/allOf}}{{/composedSchemas}}
  {{/gson}}

新生成的对象现在将拥有您的所有枚举

public enum EnumObject {
  
  VALUE_A1(VALUE_A1),
  VALUE_A2(VALUE_A2),
  VALUE_B1(VALUE_B1),
  VALUE_B2(VALUE_B2),
  VALUE_B3(VALUE_B3);

  private EnumObjectA value;

相关问题