你如何让 maven swagger codegen 插件使用继承生成 Java 类?



在我们的swagger.yaml文件中,我们有一个定义Cat,它使用allOf来包含Pet的所有属性。

Cat:
allOf:
- $ref: '#/definitions/Pet'
- type: object
properties:
# ...

期望在生成 Java 源代码时,我们得到

public class Cat extends Pet {

这在使用 Swagger 编辑器时有效。

使用未设置configOptionsswagger-codegen-maven-plugin时,我们得到以下结果:

public class Cat {

Cat自己实现Pet的所有属性,而不是扩展它。

你如何告诉swagger-codegen-maven-plugin使用继承的Java(即extends(?(我们尝试了 spring 和 java 作为语言。

下面是一个示例 swagger.yaml 文件:

swagger: '2.0'
info:
version: 1.0.0
title: simple inheritance
tags:
- name: "pet"
paths:
/cat:
put:
tags:
- "pet"
operationId: "updateCat"
consumes:
- "application/json"
parameters:
- in: "body"
name: "body"
required: true
schema:
$ref: "#/definitions/Cat"
responses:
200:
description: Nada
definitions:
Pet:
type: "object"
required:
- "name"
properties:
name:
type: "string"
example: "doggie"
Cat:
allOf:
- $ref: '#/definitions/Pet'
- type: object
properties:
huntingSkill:
type: string
required:
- huntingSkill

正如Chiochuan在github上指出的那样,解决方法是添加

discriminator: "type"

到父类的定义,以使 Java 子类扩展它。

definitions:
Pet:
type: "object"
discriminator: "type"
required:
- "name"
properties:
name:
type: "string"
example: "doggie"

这有点奇怪,因为 OpenAPI 规范版本 2.0 规定discriminator固定字段必须引用来自同一架构的属性,并且它必须是required属性,这两种情况都不是这样 - 但它有效,至少到今天为止是这样。 :)

有没有理由不想包含">configOptions"?swagger-codegen-maven-plugin 版本 4.3.1 适用于以下配置。

<plugin>
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<version>4.3.1</version>
<executions>
<execution>
<id>spring-boot-api</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>YOUR_SPEC_FILE</inputSpec>
<generatorName>spring</generatorName>
<configOptions>
<skipDefaultInterface>true</skipDefaultInterface>
<interfaceOnly>true</interfaceOnly>
<dateLibrary>java8</dateLibrary>
<sourceFolder>src/main/java</sourceFolder>
</configOptions>
<library>spring-boot</library>
<apiPackage>com.api</apiPackage>
<modelPackage>com.api.model</modelPackage>
<invokerPackage>com.api.handler</invokerPackage>
<typeMappings>
<typeMapping>OffsetDateTime=LocalDateTime</typeMapping>
</typeMappings>
<importMappings>
<importMapping>java.time.OffsetDateTime=java.time.LocalDateTime</importMapping>
</importMappings>
</configuration>
</execution>
</executions>
</plugin>

相关内容

  • 没有找到相关文章

最新更新