openapi-generator-maven-plugin (Java) 无法正确处理 allOf

nor*_*bjd 14 java openapi openapi-generator

通过org.openapitools:openapi-generator-maven-plugin,我注意到allOf在响应中使用由多个对象组成不会生成组合这些多个对象的类。相反,它使用本节中定义的第一个类allOf

这是一个最小的例子(openapi.yaml):

openapi: 3.0.0
info:
  title: Test
  version: v1
paths:
  /test:
    get:
      operationId: get
      responses:
        '200':
          description: Get
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/A'
                  - $ref: '#/components/schemas/B'
components:
  schemas:
    A:
      type: object
      properties:
        attA:
          type: string
    B:
      type: object
      properties:
        attB:
          type: integer
Run Code Online (Sandbox Code Playgroud)

通过以下方式在 Java 中生成类时:

mvn org.openapitools:openapi-generator-maven-plugin:5.2.0:generate \
    -Dopenapi.generator.maven.plugin.inputSpec=openapi.yaml \
    -Dopenapi.generator.maven.plugin.generatorName=java
Run Code Online (Sandbox Code Playgroud)

它显示一个警告:

[WARNING] allOf with multiple schemas defined. Using only the first one: A
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,它生成了类 A 和 B。但是,当调用 时get(),调用返回的值的类型为A

mvn org.openapitools:openapi-generator-maven-plugin:5.2.0:generate \
    -Dopenapi.generator.maven.plugin.inputSpec=openapi.yaml \
    -Dopenapi.generator.maven.plugin.generatorName=java
Run Code Online (Sandbox Code Playgroud)

相反,我期望包含AB属性(attAattB)的复合对象,如下所示(来自https://editor.swagger.io/的结果):

swagger 编辑器上的结果

我在 GitHub 上创建了一个问题,但希望这里有人可能遇到了同样的问题并设法解决它。

另外,我无法修改openapi.yaml文件,因为它是我必须调用的 API 提供的 OpenAPI 规范,因此修改它没有任何意义,并且如果 OpenAPI 规范随着时间的推移而发生变化,管理起来会变得非常困难。

nor*_*bjd 0

6.0.0 版本通过生成由两个对象和组成的openapi-generator-maven-plugin类 () 解决了该问题。使用以下命令生成类后:Get200ResponseAB

mvn org.openapitools:openapi-generator-maven-plugin:6.0.0:generate \
    -Dopenapi.generator.maven.plugin.inputSpec=openapi.yaml \
    -Dopenapi.generator.maven.plugin.generatorName=java
Run Code Online (Sandbox Code Playgroud)

我可以看到那个新Get200Response课程:

mvn org.openapitools:openapi-generator-maven-plugin:6.0.0:generate \
    -Dopenapi.generator.maven.plugin.inputSpec=openapi.yaml \
    -Dopenapi.generator.maven.plugin.generatorName=java
Run Code Online (Sandbox Code Playgroud)

我能够使以下代码工作。在该示例中,我有一个虚拟网络服务器侦听端口5000并定义/test返回{"attA": "hello", "attB": 1}.

package org.openapitools.client.model;

// ...

public class Get200Response {
  public static final String SERIALIZED_NAME_ATT_A = "attA";
  @SerializedName(SERIALIZED_NAME_ATT_A)
  private String attA;

  public static final String SERIALIZED_NAME_ATT_B = "attB";
  @SerializedName(SERIALIZED_NAME_ATT_B)
  private Integer attB;

  // ...
}
Run Code Online (Sandbox Code Playgroud)

成功打印:

hello
1
Run Code Online (Sandbox Code Playgroud)