1. 概述
Lombok 是一个 Java 库,它有助于减少诸如 getter、setter 等样板代码。OpenAPI 提供了一个属性,可以自动生成带有 Lombok 注解的模型。
在本教程中,我们将探索如何使用 OpenAPI 代码生成器根据规范生成带有 Lombok 注解的模型。
2. 项目设置
首先,我们从头开始创建一个 Spring Boot 项目,并添加 Spring Boot Starter Web 和 Lombok 依赖:
<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 注解、Gson 和 Java 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 的模式,包括 id、name 和 author 字段,并定义了一个获取存储书籍的端点。
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 上找到。