1. 概述

Lombok 是一个 Java 库,它有助于减少诸如 getter、setter 等样板代码。OpenAPI 提供了一个属性,可以自动生成带有 Lombok 注解的模型。

在本教程中,我们将探索如何使用 OpenAPI 代码生成器根据规范生成带有 Lombok 注解的模型。

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 的模型创建一个 API 规范,并使用 OpenAPI 代码生成器生成带有 Lombok 注解的代码。

3. 使用 OpenAPI 生成模型

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

3.1. 创建模型规范

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

在这个规范中,我们定义了 Book 的模式,包括 idnameauthor 字段,并定义了一个获取存储书籍的端点。

3.2. 使用 Lombok 注解生成模型

在定义 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

上述命令会在 target 文件夹中生成 Book 模型。

3.3. 生成的代码

让我们看看生成的 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 会生成一个接受类中所有字段参数的构造函数。

4. 总结

在这篇文章中,我们学习了如何使用 OpenAPI 代码生成器根据规范生成带有 Lombok 注解的模型。通过 additionalModelTypeAnnotations 属性,我们可以灵活地添加所需的 Lombok 注解。

如往常一样,示例的完整源代码可在 GitHub 上找到。


原始标题:Generate Models Using OpenAPI With Lombok Annotations | Baeldung