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)
相反,我期望包含A和B属性(attA和attB)的复合对象,如下所示(来自https://editor.swagger.io/的结果):
我在 GitHub 上创建了一个问题,但希望这里有人可能遇到了同样的问题并设法解决它。
另外,我无法修改该openapi.yaml文件,因为它是我必须调用的 API 提供的 OpenAPI 规范,因此修改它没有任何意义,并且如果 OpenAPI 规范随着时间的推移而发生变化,管理起来会变得非常困难。
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)
| 归档时间: |
|
| 查看次数: |
9885 次 |
| 最近记录: |