使用 OpenAPI 生成带有 Lombok 注解的 Model

1、概览

Lombok 是一个 Java 库,有助于减少 getter、setter 等模板代码。OpenAPI 提供了一个属性,用于自动生成带有 Lombok 注解的 Model。

在本教程中,我们将探讨如何使用 OpenAPI 代码生成器生成带有 Lombok 注解的 Model。

2、项目设置

首先,让我们创建一个 Spring Boot 项目,并添加 Spring Boot Starter WebLombok 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>3.1.2</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.28</version>
    <scope>provided</scope>
</dependency>

此外,我们还需要 Swagger 注解GsonJava Annotation API 依赖,以防止在生成的代码中出现与包相关的错误:

<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>
<dependency>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-annotations</artifactId>
    <version>1.6.2</version>
</dependency>

在下一节中,我们将为一个名为 Book 的 model 创建一个 API 规范,然后使用 OpenAPI 代码生成器生成带有 Lombok 注解的代码。

3、使用 OpenAPI 生成 Model

OpenAPI 的理念是在开始实际编码之前编写 API 规范。在这里,我们将创建一个规范文件,并根据规范生成一个 model。

3.1、创建 model 规范

首先,让我们在 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

在上述规范中,我们定义了包含 idnameauthor 字段的 Book schema。此外,我们还定义了一个端点,用于获取所有已存储的 book。

3.2、生成带有 Lombok 注解的 Model

定义完 API 规范后,让我们在 pom.xml 中添加 OpenAPI plugin ,以帮助根据规范生成代码:

<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 属性,以便为 model 添加三个 Lombok 注解。

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

最后,执行 Maven install 命令生成 model:

$ ./mvnw install

上述命令将在 target 文件夹中生成 Book model。

3.3、生成的代码

让我们来看看生成的 Book model:

@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 注解被添加到了 model 类中。

@Data 注解有助于在编译时生成 getter、setter 等方法。@NoArgsConstructor 会生成一个无参构造函数,而 @AllArgsConstructor 会生成一个全参构造函数,该构造函数接收类中所有字段的参数。

4、总结

在本文中,我们学习了如何使用 OpenAPI 代码生成器生成带有 Lombok 注解的 model。通过添加 additionalModelTypeAnnotations 属性,我们可以灵活地添加所需的 Lombok 注解。


参考:https://www.baeldung.com/java-openapi-lombok-create-models