Swagger-Codegen 不使用供应商扩展 x-discriminator-value
Swagger-Codegen does not use vendor extension x-discriminator-value
我正在尝试使用 swagger-codegen 为架构规范生成 Java API 客户端。
该架构使用供应商扩展 x-discriminator-value
来创建继承模型。
例如,我使用了作为 yaml here 并转换为 json 的模式规范(我用 "spec" 根包装了结果,因此我可以发送结果到在线代码生成器,如下文所述)。
当我尝试在本地或使用在线代码生成器生成 Java 客户端时,我发现未使用 x-discriminator-value
值完成反序列化。
相反,它是用模型名称完成的。
我在生成的 JSON.java
文件中看到了这一点,该文件包含从鉴别器到 class:
的映射
classByDiscriminatorValue.put("PhoneSetting".toUpperCase(), PhoneSetting.class);
classByDiscriminatorValue.put("SceneSetting".toUpperCase(), SceneSetting.class);
classByDiscriminatorValue.put("TextSetting".toUpperCase(), TextSetting.class);
[要查看此内容,您可以 post
上面的 json 到 https://generator.swagger.io/api/gen/clients/java
并检查 JSON.java
文件。
据我了解,我应该知道密钥应该是 x-discriminator-value
值。因此,例如,由于模式具有:
"SceneSetting": {
"description": "Scene Setting",
"x-discriminator-value": "SCENE",
"allOf": [
{
"$ref": "#/definitions/SectionSetting"
},
那我应该有一个映射
classByDiscriminatorValue.put("SCENE".toUpperCase(), SceneSetting.class);
而不是
classByDiscriminatorValue.put("SceneSetting".toUpperCase(), SceneSetting.class);
对于此事,我将不胜感激。
我建议迁移到 OpenAPI 3.0 – 它内置了对 discriminator mapping. There are 的支持以帮助迁移,但您必须手动更新映射。
在 OpenAPI 3.0 中,鉴别器映射在父模式中指定(而不是在子模式中)。以下示例是 YAML 中的可读性,您可以使用 https://www.json2yaml.com 将其转换为 JSON.
openapi: 3.0.2
components:
schemas:
# Parent schema
SectionSetting:
type: object
properties:
...
discriminator:
propertyName: PROP_NAME
mapping:
SCENE: SceneSetting
...
# Child schema
SceneSetting:
description: Scene Setting
allOf:
- $ref: '#/components/schemas/SectionSetting'
- ...
确保使用 Swagger Codegen 版本 3.x,因为 2.x 不支持 OpenAPI 3.0。您可以从 Maven Central 获取最新的 3.x CLI JAR:
https://mvnrepository.com/artifact/io.swagger.codegen.v3/swagger-codegen-cli
在旧版 Swagger 2 上使用供应商扩展 x-discriminator-value
会受到多重限制。
有关 openapi-generator
项目的详细信息,请参阅 CodegenDiscriminator.java:
// legacyDiscriminatorBehavior == True, this contains:
// - the name to schema map info in the discriminMappedModelator mapping entry in your openapi spec AND
// - x-discriminator-value mappings in child oneOf + anyOf schemas + descendant schemas that allOf inherit self schema AND
// - descendant schemas that allOf inherit self schema AND
// - child oneOf + anyOf schemas
我正在尝试使用 swagger-codegen 为架构规范生成 Java API 客户端。
该架构使用供应商扩展 x-discriminator-value
来创建继承模型。
例如,我使用了作为 yaml here 并转换为 json 的模式规范(我用 "spec" 根包装了结果,因此我可以发送结果到在线代码生成器,如下文所述)。
当我尝试在本地或使用在线代码生成器生成 Java 客户端时,我发现未使用 x-discriminator-value
值完成反序列化。
相反,它是用模型名称完成的。
我在生成的 JSON.java
文件中看到了这一点,该文件包含从鉴别器到 class:
classByDiscriminatorValue.put("PhoneSetting".toUpperCase(), PhoneSetting.class);
classByDiscriminatorValue.put("SceneSetting".toUpperCase(), SceneSetting.class);
classByDiscriminatorValue.put("TextSetting".toUpperCase(), TextSetting.class);
[要查看此内容,您可以 post
上面的 json 到 https://generator.swagger.io/api/gen/clients/java
并检查 JSON.java
文件。
据我了解,我应该知道密钥应该是 x-discriminator-value
值。因此,例如,由于模式具有:
"SceneSetting": {
"description": "Scene Setting",
"x-discriminator-value": "SCENE",
"allOf": [
{
"$ref": "#/definitions/SectionSetting"
},
那我应该有一个映射
classByDiscriminatorValue.put("SCENE".toUpperCase(), SceneSetting.class);
而不是 classByDiscriminatorValue.put("SceneSetting".toUpperCase(), SceneSetting.class);
对于此事,我将不胜感激。
我建议迁移到 OpenAPI 3.0 – 它内置了对 discriminator mapping. There are
在 OpenAPI 3.0 中,鉴别器映射在父模式中指定(而不是在子模式中)。以下示例是 YAML 中的可读性,您可以使用 https://www.json2yaml.com 将其转换为 JSON.
openapi: 3.0.2
components:
schemas:
# Parent schema
SectionSetting:
type: object
properties:
...
discriminator:
propertyName: PROP_NAME
mapping:
SCENE: SceneSetting
...
# Child schema
SceneSetting:
description: Scene Setting
allOf:
- $ref: '#/components/schemas/SectionSetting'
- ...
确保使用 Swagger Codegen 版本 3.x,因为 2.x 不支持 OpenAPI 3.0。您可以从 Maven Central 获取最新的 3.x CLI JAR:
https://mvnrepository.com/artifact/io.swagger.codegen.v3/swagger-codegen-cli
在旧版 Swagger 2 上使用供应商扩展 x-discriminator-value
会受到多重限制。
有关 openapi-generator
项目的详细信息,请参阅 CodegenDiscriminator.java:
// legacyDiscriminatorBehavior == True, this contains:
// - the name to schema map info in the discriminMappedModelator mapping entry in your openapi spec AND
// - x-discriminator-value mappings in child oneOf + anyOf schemas + descendant schemas that allOf inherit self schema AND
// - descendant schemas that allOf inherit self schema AND
// - child oneOf + anyOf schemas