Spec4j:基于Java注解的REST API文档自动化生成方案
如果你在开发 REST API 时,厌倦了在代码和冗长的 YAML 或 JSON 规范文件之间来回切换、手动同步的繁琐工作,那么今天介绍的这个开源项目Spec4j或许能让你眼前一亮。它的核心目标非常直接:让你的 REST API 实现“无 YAML”化,通过 Java 注解直接在代码中定义 API 规范,并自动生成符合 OpenAPI 标准的文档。
对于后端开发者,尤其是使用 Spring Boot 的 Java 开发者来说,这意味着什么?这意味着你不再需要维护一个独立的openapi.yaml或swagger.json文件。你的 API 路径、请求/响应模型、参数描述、甚至示例值,都直接写在你的 Controller 和 DTO 类上。当你修改业务逻辑时,API 文档会自动同步更新,彻底杜绝了文档与代码不同步的“古老”问题。
本文将带你快速了解 Spec4j 的核心能力、适用场景,并通过一个从零开始的 Spring Boot 项目,演示如何集成 Spec4j、编写带注解的代码,并最终验证自动生成的交互式 API 文档。我们重点关注它的易用性、与现有工作流的整合度,以及在实际开发中可能遇到的坑和解决方案。
1. 核心能力速览
在深入代码之前,我们先通过一个表格快速把握 Spec4j 的核心特性和技术门槛:
| 能力项 | 说明 |
|---|---|
| 项目类型 | Java 库(主要面向 Spring Boot 应用) |
| 核心功能 | 通过 Java 注解定义 API 契约,自动生成 OpenAPI 3.0 规范文档 |
| 核心卖点 | “YAMLless”- 无需手动编写和维护独立的 YAML/JSON 规范文件 |
| 输出格式 | 符合 OpenAPI 3.0 标准的 JSON/YAML 文档,并提供 Swagger UI 界面 |
| 启动方式 | 作为依赖库集成到 Spring Boot 项目中,随应用启动而启动 |
| 硬件门槛 | 无特殊要求,依赖 Java 运行环境 |
| 是否支持 API | 其本身即是用于生成 API 文档的工具,生成的文档可通过标准接口访问 |
| 是否支持批量 | 不涉及,其工作是按项目维度自动生成整个应用的 API 文档 |
| 适合场景 | Java (Spring Boot) 后端项目开发、需要维护高质量且实时同步的 API 文档的团队 |
简单来说,Spec4j 扮演了一个“桥梁”角色。它读取你代码中的特定注解,在应用运行时动态构建出完整的 OpenAPI 对象模型,然后既可以提供 JSON 格式的规范端点(如/v3/api-docs),也可以渲染出友好的 Swagger UI 页面供前端和测试人员查阅。
2. 适用场景与使用边界
在决定是否引入 Spec4j 之前,明确它的适用场景和边界非常重要。
Spec4j 非常适合以下情况:
- Spring Boot 技术栈项目:Spec4j 深度集成 Spring Web MVC,对
@RestController,@RequestMapping,@RequestParam等注解有原生支持。 - 追求开发效率与一致性:团队希望践行“文档即代码”(Documentation as Code)的理念,避免因手动更新文档而产生的滞后和错误。
- API 优先或设计驱动开发:虽然 Spec4j 是“代码优先”,但它生成的规范是标准的 OpenAPI,可以用于后续的客户端 SDK 生成、Mock 服务器搭建等。
- 需要实时、可交互的文档:生成的 Swagger UI 允许调用者直接在浏览器中尝试发送请求,极大方便了前后端联调和 API 测试。
Spec4j 可能不适用或需要斟酌的场景:
- 非 Spring Boot 的 Java 项目:虽然理论上可通过适配使用,但官方支持和便利性会大打折扣。
- API 规范极度复杂或需要高度定制化:对于 OpenAPI 规范中一些非常边缘或复杂的特性,通过注解表达可能不如直接写 YAML 灵活。不过,大部分常见场景都已覆盖。
- 项目已稳定并拥有完善的、手工维护的 OpenAPI 文件:迁移成本需要评估,虽然长远看有益,但短期会带来改动。
- 对运行时性能有极端要求:注解解析和 OpenAPI 模型构建发生在应用启动时,会增加少量的启动时间。对于运行时性能无影响。
使用边界与合规提醒:
- 代码即合同:一旦使用 Spec4j,你代码中的注解就成为 API 契约的唯一来源。必须确保注解的准确性,例如参数是否必填、数据类型、取值范围等。
- 避免信息泄露:自动生成的文档可能暴露内部接口、数据结构或字段含义。在生产环境,务必通过配置关闭文档端点或对其添加访问权限控制。
- 版本管理:API 的变更历史体现在代码提交历史中。合理的 Git 分支和提交信息规范有助于追踪 API 的演进。
3. 环境准备与前置条件
要开始使用 Spec4j,你需要准备一个标准的 Java Spring Boot 开发环境。
- 操作系统:Windows, macOS 或 Linux 均可。
- Java 版本:推荐 JDK 11 或更高版本(JDK 17 为当前 Spring Boot 3.x 的推荐版本)。
- 构建工具:Maven 或 Gradle。本文示例将使用 Maven。
- IDE:IntelliJ IDEA, Eclipse 或 VS Code 等,具备 Spring Boot 支持为佳。
- Spring Boot 版本:建议使用 Spring Boot 2.7.x 或 3.x 版本。Spec4j 需要与 Spring Boot 的 Web 模块协同工作。
- 网络:需要能正常访问 Maven Central 仓库以下载依赖。
你可以通过以下命令快速验证环境:
# 检查 Java 版本 java -version # 检查 Maven 版本 mvn -v4. 安装部署与启动方式
Spec4j 的“安装”其实就是添加依赖。我们创建一个全新的 Spring Boot 项目来演示。
步骤 1:创建 Spring Boot 项目使用 Spring Initializr 或 IDE 的创建向导,生成一个基础项目。关键依赖选择:
- Spring Web:用于构建 REST API。
- Spring Boot DevTools(可选):方便开发热重启。
生成项目后,你会得到一个标准的 Maven 项目结构。
步骤 2:添加 Spec4j 依赖打开项目的pom.xml文件,在<dependencies>部分添加 Spec4j 的依赖。截至本文撰写时,你需要将 Spec4j 的仓库和依赖手动加入。请注意,Spec4j 可能尚未发布到 Maven Central,你需要检查其官方 GitHub 仓库获取最新的安装方式。
假设其坐标可用,添加方式如下:
<dependency> <groupId>com.github.spec4j</groupId> <!-- 请替换为实际 GroupId --> <artifactId>spec4j-spring-boot-starter</artifactId> <!-- 请替换为实际 ArtifactId --> <version>最新版本</version> <!-- 请替换为实际版本号 --> </dependency>重要:由于 Spec4j 是一个 Show HN 项目,其稳定性和发布渠道可能变化。最可靠的方式是克隆其 GitHub 仓库,查看README.md或pom.xml来获取准确的集成步骤。可能需要先本地构建安装。
步骤 3:启用 Spec4j在 Spring Boot 的主应用类或一个配置类上,添加启用注解。通常会是@EnableSpec4j或类似的注解。具体注解名称需参考 Spec4j 文档。
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; // import com.spec4j.annotation.EnableSpec4j; // 假设的导入 @SpringBootApplication // @EnableSpec4j // 启用 Spec4j 自动生成 OpenAPI 文档 public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }步骤 4:启动应用完成依赖添加和配置后,像启动任何 Spring Boot 应用一样启动你的项目。
# 在项目根目录下 mvn spring-boot:run或者直接在 IDE 中运行DemoApplication的 main 方法。
应用启动后,Spec4j 会在后台扫描被注解的 Controller,构建 OpenAPI 模型。
5. 功能测试与效果验证
现在,我们来创建几个简单的 API,并用 Spec4j 的注解来描述它们,最后验证生成的文档。
5.1 编写一个用户管理 API
首先,创建一个用户请求和响应的 DTO(数据传输对象)。这里我们会使用 Spec4j 的注解来描述字段。
// UserDTO.java import io.swagger.v3.oas.annotations.media.Schema; // 注意:这里使用了标准的 springdoc-openapi 注解作为示例。Spec4j 会有其专属注解,如 @SpecSchema。 // 假设 Spec4j 的注解是 @SpecSchema, @SpecProperty // import com.spec4j.annotation.SpecSchema; // import com.spec4j.annotation.SpecProperty; //@SpecSchema(title = “用户信息”, description = “用户的请求和响应数据模型”) @Schema(name = “User”, description = “用户信息”) // 示例,实际使用 Spec4j 注解 public class UserDTO { // @SpecProperty(description = “用户唯一ID”, example = “123”) @Schema(description = “用户唯一ID”, example = “123”) private Long id; // @SpecProperty(description = “用户名”, example = “张三”, required = true) @Schema(description = “用户名”, example = “张三”, requiredMode = Schema.RequiredMode.REQUIRED) private String username; // @SpecProperty(description = “用户邮箱”, example = “zhangsan@example.com”) @Schema(description = “用户邮箱”, example = “zhangsan@example.com”) private String email; // 省略构造函数、Getter 和 Setter // ... }关键点:你需要将@Schema替换为 Spec4j 提供的对应注解(例如@SpecSchema,@SpecProperty)。这些注解用于定义模型的详细描述、示例值、是否必填等元数据。
接下来,创建一个 REST Controller。
// UserController.java import org.springframework.web.bind.annotation.*; import java.util.*; //@SpecTag(name = “用户管理”, description = “用户相关的增删改查接口”) // 假设的 Spec4j 注解,用于分组 @RestController @RequestMapping(“/api/users”) public class UserController { private Map<Long, UserDTO> userMap = new HashMap<>(); private Long nextId = 1L; // @SpecOperation(summary = “创建用户”, description = “根据传入的用户信息创建一个新用户”) @PostMapping public UserDTO createUser(@RequestBody UserDTO userDTO) { userDTO.setId(nextId++); userMap.put(userDTO.getId(), userDTO); return userDTO; } // @SpecOperation(summary = “获取用户列表”, description = “获取所有用户的列表”) @GetMapping public List<UserDTO> getUsers() { return new ArrayList<>(userMap.values()); } // @SpecOperation(summary = “根据ID获取用户”, description = “通过用户ID查询特定的用户信息”) // @SpecParameter(name = “id”, description = “用户ID”, in = ParameterIn.PATH, required = true, example = “1”) @GetMapping(“/{id}”) public UserDTO getUserById(@PathVariable Long id) { return userMap.get(id); } // @SpecOperation(summary = “更新用户”, description = “根据ID更新用户信息”) @PutMapping(“/{id}”) public UserDTO updateUser(@PathVariable Long id, @RequestBody UserDTO userDTO) { if (userMap.containsKey(id)) { userDTO.setId(id); userMap.put(id, userDTO); return userDTO; } return null; // 实际应抛异常 } // @SpecOperation(summary = “删除用户”, description = “根据ID删除用户”) @DeleteMapping(“/{id}”) public void deleteUser(@PathVariable Long id) { userMap.remove(id); } }关键点:在 Controller 方法上,我们使用了假设的@SpecOperation和@SpecParameter注解来描述每个接口的用途和参数细节。@SpecTag用于在文档中对接口进行分组。
5.2 验证生成的 API 文档
启动你的 Spring Boot 应用。如果 Spec4j 集成成功,它会默认注册一些端点。
访问 OpenAPI JSON 规范: 通常在
/v3/api-docs或/api-docs路径下。尝试在浏览器中访问:http://localhost:8080/v3/api-docs你应该能看到一个完整的、符合 OpenAPI 3.0 规范的 JSON 输出。这个 JSON 结构完全由你的代码注解驱动生成,里面包含了
/api/users的所有路径、方法、参数、请求体、响应体模型及其描述和示例。访问 Swagger UI 界面: Spec4j 很可能也集成了 Swagger UI。尝试访问:
http://localhost:8080/swagger-ui.html 或 http://localhost:8080/swagger-ui/你应该能看到一个美观的、可交互的 API 文档页面。“用户管理”分组下会列出我们创建的所有接口(GET /api/users, POST /api/users, GET /api/users/{id} 等)。
在 Swagger UI 中进行接口测试:
- 点击 “POST /api/users” 接口,点击 “Try it out”。
- 在请求体(Request body)中,你会看到根据
UserDTO注解生成的示例 JSON 结构,并且字段的描述信息也会显示出来。 - 修改示例 JSON 中的
username和email,然后点击 “Execute”。 - 观察右侧的服务器响应(Responses)。如果成功,你会看到状态码 200 和返回的用户数据(包含生成的ID)。
- 接着,你可以尝试 “GET /api/users” 来查看刚刚创建的用户列表。
成功标准:
- 能够成功访问
/v3/api-docs端点并看到结构化的 JSON。 - 能够成功访问 Swagger UI 页面并看到所有定义的接口。
- 能够在 Swagger UI 中成功执行 API 调用并得到预期结果。
- JSON 规范和 UI 中显示的接口描述、参数、模型信息与你代码中的注解一致。
6. 接口 API 与批量任务
Spec4j 本身不提供业务 API,它提供的是生成 API 文档规范的“元”API。理解这一点很重要。
Spec4j 生成的“接口”:
- OpenAPI 规范端点:例如
/v3/api-docs。这是一个标准的 GET 接口,返回 JSON。这个接口可以被其他工具消费,比如用于生成客户端 SDK、导入到 API 管理平台等。 - Swagger UI 资源:一系列 HTML、JS、CSS 文件,构成一个可交互的 Web 界面。
如何以编程方式获取 OpenAPI 规范?你可以在自己的代码中,或者通过外部脚本,调用/v3/api-docs端点来获取规范,用于自动化流程。
# 使用 curl 获取规范并保存为文件 curl -X GET http://localhost:8080/v3/api-docs -H “accept: application/json” -o openapi-spec.json# 使用 Python requests 库获取规范 import requests import json response = requests.get(“http://localhost:8080/v3/api-docs”, headers={“accept”: “application/json”}) if response.status_code == 200: openapi_spec = response.json() # 处理 openapi_spec,例如保存或分析 with open(‘openapi.json’, ‘w’) as f: json.dump(openapi_spec, f, indent=2) print(“OpenAPI 规范已保存。”) else: print(f“请求失败: {response.status_code}”)关于“批量任务”:Spec4j 的工作模式是“全量扫描”和“运行时生成”,不存在传统意义上的“批量任务”队列。它的“批量”体现在:
- 启动时批量扫描:应用启动时,Spec4j 会批量扫描所有带有特定注解的类和方法,一次性构建出整个应用的 API 模型。
- 文档全量提供:
/v3/api-docs端点一次性返回整个应用的 API 规范,而不是按需生成。
对于开发者而言,这简化了流程。你只需要关注代码和注解,文档的“批量生成”和“批量提供”由框架在后台自动完成。
7. 资源占用与性能观察
作为一个开发工具库,Spec4j 的资源占用主要集中在应用启动阶段,对运行时性能影响微乎其微。
启动阶段性能影响:
- 时间开销:Spec4j 需要在应用启动时执行类路径扫描,解析所有相关的注解,并构建 OpenAPI 模型对象。对于大型项目(数百个 Controller 和模型类),这可能会增加几秒到十几秒的启动时间。对于中小型项目,影响通常在一两秒内,感知不强。
- 内存开销:构建的 OpenAPI 模型会驻留在内存中。这个模型是一个复杂的对象图,但对于现代 JVM 内存来说,其占用通常很小(几 MB 到几十 MB),与业务数据相比可忽略不计。
运行时性能影响:
- API 文档端点 (
/v3/api-docs):当请求该端点时,Spec4j 需要将内存中的 OpenAPI 模型序列化为 JSON。这是一个计算操作,但其性能与返回的 JSON 大小成正比。对于大型 API 集合,响应体可能达到几百 KB 甚至上 MB,序列化和网络传输会消耗一定资源。建议在生产环境禁用或保护此端点。 - Swagger UI 资源:提供的是静态资源(HTML, JS, CSS),由 Spring Boot 的静态资源处理器处理,性能开销与提供其他静态文件无异。
- 业务 API 性能:零影响。Spec4j 的注解在运行时是只读的元数据,不影响业务方法的执行逻辑、速度或资源消耗。
监控与优化建议:
- 生产环境配置:务必通过配置关闭 Swagger UI 和
/v3/api-docs端点的自动注册,或者通过 Spring Security 等机制对其进行严格的访问控制(如只允许内网或特定IP访问)。# application-prod.yml (生产环境配置) # 假设 Spec4j 的配置属性为 spec4j.enabled spec4j: enabled: false # 或者使用 Spring Boot 的通用配置来禁用 Swagger # springdoc: # api-docs: # enabled: false # swagger-ui: # enabled: false - 开发体验:在开发环境,可以放心启用。结合 Spring Boot DevTools,修改代码后热重启,新的 API 变更会立即反映在文档中。
- 观察启动日志:启动时关注日志,看是否有 Spec4j 相关的扫描或初始化错误。这些错误通常是由于注解使用不当或依赖冲突引起的。
8. 常见问题与排查方法
在集成和使用 Spec4j 的过程中,你可能会遇到一些问题。下表列出了一些常见问题及其排查思路。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
应用启动失败,报ClassNotFoundException或NoClassDefFoundError与 Spec4j 相关 | 1. Spec4j 依赖未正确添加或下载。 2. 版本与 Spring Boot 不兼容。 | 1. 检查pom.xml或build.gradle中的依赖配置。2. 运行 mvn dependency:tree查看依赖树,确认 Spec4j 库是否存在。3. 查看完整的异常堆栈信息。 | 1. 确认依赖坐标正确,网络通畅,能下载到 Jar 包。 2. 尝试调整 Spec4j 或 Spring Boot 的版本。查阅 Spec4j 官方文档的兼容性说明。 |
启动成功,但访问/v3/api-docs或/swagger-ui.html返回 404 | 1. Spec4j 未正确启用或自动配置失败。 2. 路径被自定义的拦截器或安全配置阻止。 3. 上下文路径(Context Path)配置导致。 | 1. 检查主应用类或配置类上是否添加了@EnableSpec4j(或类似)注解。2. 检查应用日志,看是否有 Spec4j 初始化的信息。 3. 检查 application.properties/yml中是否有server.servlet.context-path配置,访问路径需加上该前缀。 | 1. 确保启用注解已添加且包扫描路径正确。 2. 如果使用了 Spring Security,确保为文档端点配置了放行规则。 3. 访问 http://localhost:8080/你的上下文路径/v3/api-docs。 |
| Swagger UI 页面能打开,但 API 列表为空或缺少某些 Controller | 1. Controller 未被 Spring 扫描到(包路径问题)。 2. Controller 或方法上缺少必要的 Spring MVC 注解(如 @RestController)。3. Spec4j 的扫描过滤器排除了某些包。 | 1. 确认 Controller 类在 Spring Boot 主应用类的同级或子包下。 2. 检查 Controller 和方法上是否有 @RequestMapping,@GetMapping等注解。3. 检查 Spec4j 的配置,看是否有设置扫描的基础包(base-package)。 | 1. 调整包结构或使用@ComponentScan手动指定扫描路径。2. 补全 Spring MVC 注解。 3. 检查并调整 Spec4j 的扫描配置。 |
| 模型(DTO)字段的描述、示例在文档中不显示 | 1. 未在 DTO 字段上使用 Spec4j 的注解(如@SpecProperty)。2. 使用了错误的注解或注解属性。 3. 注解未正确导入。 | 1. 对比代码和生成的 JSON 规范,看模型定义部分是否有description和example。2. 查看 Spec4j 的官方示例或源码,确认注解的正确用法。 | 1. 在 DTO 字段上添加正确的 Spec4j 注解并设置属性。 2. 确保导入的是 com.spec4j.annotation.*下的注解,而不是其他库的(如io.swagger.v3.oas.annotations)。 |
| 生成的 OpenAPI JSON 格式不正确或缺少关键信息 | 1. Spec4j 版本存在 Bug。 2. 注解使用方式不符合 OpenAPI 规范。 | 1. 将生成的 JSON 粘贴到 Swagger Editor 中验证语法。 2. 简化你的 API 和模型,进行最小化测试,定位是哪个特定注解导致的问题。 | 1. 升级或降级 Spec4j 到更稳定的版本。 2. 向 Spec4j 项目仓库提交 Issue,附上复现代码和生成的 JSON 片段。 |
| 集成后,应用启动变得非常慢 | 项目规模大,类路径下需要扫描的类太多。 | 观察启动日志,看时间消耗在哪个阶段。 | 1. 在 Spec4j 配置中明确指定要扫描的包路径,减少扫描范围。 2. 如果不需要在开发环境外使用,考虑仅在有文档需求的 Profile 中启用 Spec4j。 |
9. 最佳实践与使用建议
为了让 Spec4j 更好地服务于你的项目,遵循一些最佳实践至关重要。
- 渐进式采用:不要试图一次性给所有老接口加上注解。可以从新模块或当前正在迭代的 API 开始,逐步覆盖。
- 注解即文档,保持准确:牢记注解现在是 API 契约的一部分。确保
description、example、required等属性与业务逻辑严格一致。错误的示例值比没有示例更糟糕。 - 统一注解风格:在团队内制定规范,例如:
- 所有公开的 API 都必须有
@SpecOperation(summary=“”)。 - 所有作为请求/响应体的 DTO 都必须有
@SpecSchema(description=“”)。 - 所有 API 参数(路径、查询、请求头)都必须有
@SpecParameter描述。
- 所有公开的 API 都必须有
- 利用分组 (
@SpecTag):使用标签对 API 进行逻辑分组(如“用户管理”、“订单管理”、“系统设置”),使 Swagger UI 界面更清晰。 - 处理复杂场景:
- 泛型:Spec4j 对泛型的支持可能有限,测试其行为,必要时在注解中明确指定具体类型。
- 继承与多态:OpenAPI 的
discriminator等高级特性可能需要特定的注解支持,查阅 Spec4j 文档看如何实现。 - 文件上传:使用
@RequestPart并配合@SpecParameter描述文件参数。
- 区分环境:
- 开发/测试环境:启用 Spec4j 和 Swagger UI,方便联调。
- 生产环境:务必禁用或严格限制访问。可以通过 Profile 来实现:
# application.yml spring: profiles: active: @spring.profiles.active@ --- # 开发环境配置 spring: config: activate: on-profile: dev spec4j: enabled: true --- # 生产环境配置 spring: config: activate: on-profile: prod spec4j: enabled: false - 将生成的规范纳入 CI/CD:可以在构建或测试阶段,通过调用
/v3/api-docs端点将最新的 OpenAPI 规范导出为文件,存档或用于与 API 网关、前端代码生成等下游流程集成。 - 备份与版本控制:虽然代码是源头,但定期将生成的规范 JSON 文件提交到仓库或存档,可以作为 API 某个时间点的快照,便于回溯和对比。
10. 总结与下一步
Spec4j 提出的“YAMLless”理念,直击了传统 API 文档维护中“代码与文档不同步”的核心痛点。对于 Spring Boot 开发者而言,它提供了一种更优雅、更不易出错的文档生成方式。通过将规范内嵌于代码注解,它确保了文档与实现的高度一致性,让开发者能更专注于业务逻辑本身。
最值得尝试的点:如果你正在启动一个新的 Spring Boot 项目,或者对一个现有项目进行重大重构,强烈建议尝试集成 Spec4j。它能从项目初期就建立起良好的 API 文档习惯。
最先应该验证的功能:从一个简单的 CRUD Controller 开始,为其方法和 DTO 加上 Spec4j 注解,然后启动应用,完整地走一遍“访问 Swagger UI -> 查看文档 -> 执行测试请求”的流程。这个端到端的体验能让你最快感受到它的价值。
最容易踩的坑:
- 依赖问题:由于是较新的开源项目,确保使用正确的、与你的 Spring Boot 版本兼容的 Spec4j 版本。
- 注解混淆:不要与 springfox-swagger 或 springdoc-openapi 的注解混用。坚持使用 Spec4j 专属的一套注解。
- 生产环境暴露:忘记禁用生产环境的文档端点,可能导致内部 API 结构暴露。
后续扩展方向:
- 探索高级特性:深入研究 Spec4j 对 OpenAPI 复杂特性的支持,如安全性定义(Security Schemes)、回调(Callbacks)、链接(Links)等。
- 集成 API 网关:将自动生成的 OpenAPI 规范文件,自动同步到你的 API 网关(如 Kong, Apigee, Spring Cloud Gateway),实现 API 的全生命周期管理。
- 客户端代码生成:利用生成的规范,通过 OpenAPI Generator 等工具,自动生成强类型的客户端 SDK(TypeScript, Java, Go 等),进一步提升前后端协作效率。
Spec4j 不仅仅是一个工具,它更代表了一种更高效的开发工作流。将它融入你的技术栈,或许能成为你提升团队 API 开发质量与协作效率的关键一步。建议收藏本文,在下次启动 Spring Boot API 项目时,亲手实践一遍。
