使用Mave OpenAPI插件生成Java模型代码

主要思路是在实际编码开始之前编写 API 规范,然后根据API规范让OpenAPI生成模型。

第一步创建一个规范文件并根据该规范生成一个模型。

首先,我们在resources文件夹中创建一个名为bookapi.yml 的新文件来定义Book规范:

openapi: 3.0.2
info:
  version: 1.0.0
  title: Book Store
  license:
    name: MIT
paths:
    /books:
      get:
        tags:
          - book
        summary: Get All Books
        responses:
          200:
            description: successful operation
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/Book'
          404:
            description: Book not found
            content: { }
components:
  schemas:
    Book:
      type: object
      required:
        - id
        - name
        - author
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
        author:
          type: string

在上面的规范中,我们使用id、name和author字段定义Book 模式。此外,我们定义了一个端点来获取所有存储的书籍。

定义完API规范后,OpenAPI插件添加到pom.xml 中,以帮助根据规范生成代码:

<plugin>
    <groupId>org.openapitools</groupId>
    <artifactId>openapi-generator-maven-plugin</artifactId>
    <version>4.2.3</version>
    <executions>
        <execution>
        <goals>
            <goal>generate</goal>
        </goals>
        <configuration>
            <inputSpec>${project.basedir}/src/main/resources/bookapi.yml</inputSpec>
        <generatorName>java</generatorName>
        <configOptions>
            <additionalModelTypeAnnotations>@lombok.Data @lombok.NoArgsConstructor @lombok.AllArgsConstructor</additionalModelTypeAnnotations>
        </configOptions>
        <generateApis>false</generateApis>
        <generateSupportingFiles>false</generateSupportingFiles>
        <generateApiDocumentation>false</generateApiDocumentation>
        </configuration>
    </execution>
    </executions>
</plugin>

在这里,我们指定插件在生成过程中检查的规范文件的位置。此外,我们添加了additionalModelTypeAnnotations属性以向模型添加三个Lombok 注释。

为简单起见,我们禁用支持文件和 API 文档的生成。

最后,让我们通过执行 Maven install命令来生成模型:

$ ./mvnw install

上面的命令在目标文件夹中生成一个Book模型。


我们来看看生成的Book模型:

@lombok.Data @lombok.NoArgsConstructor @lombok.AllArgsConstructor
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-08-16T09:16:34.322697262Z[GMT]")
public class Book {
    public static final String SERIALIZED_NAME_ID =
"id";
    @SerializedName(SERIALIZED_NAME_ID)
    private Long id;
  
    public static final String SERIALIZED_NAME_NAME =
"name";
    @SerializedName(SERIALIZED_NAME_NAME)
    private String name;
  
    public static final String SERIALIZED_NAME_AUTHOR =
"author";
    @SerializedName(SERIALIZED_NAME_AUTHOR)
    private String author;
   
// ... 
}

在上面生成的代码中,我们使用additionalModelTypeAnnotations属性在插件中定义的三个Lombok 注释被添加到模型类中。

  • @Data注释有助于在编译时生成 getter、setter 等。
  • @NoArgsConstructor生成一个空构造函数,
  • @ AllArgsConstructor生成一个为类中所有字段接受参数的构造函数。

示例的完整源代码可在 GitHub 上获取