1. 引言
在前后端分离的开发模式下,接口文档的维护一直是个痛点。Swagger 作为一款流行的 API 文档工具,能够根据代码自动生成接口文档,并提供在线调试功能,极大提升了团队协作效率。本文将通过丰富的代码实例,带你从零开始掌握 Swagger 的集成与使用。
2. Swagger 简介
Swagger 是一套围绕 OpenAPI 规范构建的开源工具集,它可以帮助开发者设计、构建、记录和使用 REST API。其核心价值在于:
- 自动生成文档:通过注解即可生成接口文档,无需手动维护。
- 在线调试:直接在文档页面发送请求,验证接口正确性。
- 多语言支持:支持 Java、Python、Node.js 等多种主流语言。
3. Spring Boot 集成 Swagger
下面以 Spring Boot 项目为例,演示如何快速集成 Swagger。首先在pom.xml中添加依赖:
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency>然后创建 Swagger 配置类,定义文档基本信息:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; @Configuration public class SwaggerConfig { @Bean public Docket createRestApi() { return new Docket(DocumentationType.OAS_30) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.example.controller")) .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("用户管理 API") .description("用户管理系统的接口文档") .version("1.0.0") .build(); } }4. 常用注解详解
Swagger 提供了一系列注解,用于描述接口的详细信息。下面通过一个用户控制器实例,展示常用注解的用法:
import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.web.bind.annotation.*; @Api(tags = "用户管理接口") @RestController @RequestMapping("/api/users") public class UserController { @ApiOperation("获取用户列表") @GetMapping public Result<List<User>> listUsers() { // 业务逻辑省略 return Result.success(userService.list()); } @ApiOperation("根据 ID 查询用户") @GetMapping("/{id}") public Result<User> getUserById( @ApiParam(value = "用户 ID", required = true) @PathVariable Long id) { return Result.success(userService.getById(id)); } @ApiOperation("创建用户") @PostMapping public Result<User> createUser( @ApiParam(value = "用户信息", required = true) @RequestBody User user) { return Result.success(userService.create(user)); } @ApiOperation("更新用户") @PutMapping("/{id}") public Result<User> updateUser( @ApiParam(value = "用户 ID", required = true) @PathVariable Long id, @ApiParam(value = "用户信息", required = true) @RequestBody User user) { return Result.success(userService.update(id, user)); } @ApiOperation("删除用户") @DeleteMapping("/{id}") public Result<Void> deleteUser( @ApiParam(value = "用户 ID", required = true) @PathVariable Long id) { userService.delete(id); return Result.success(); } }其中@Api用于描述控制器类,@ApiOperation描述接口功能,@ApiParam描述参数信息。启动项目后,访问http://localhost:8080/swagger-ui/index.html即可查看文档页面。
5. 实体类文档描述
为了让文档更完整,还需要对实体类进行描述。使用@ApiModel和@ApiModelProperty注解:
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @ApiModel("用户实体") public class User { @ApiModelProperty(value = "用户 ID", example = "1") private Long id; @ApiModelProperty(value = "用户名", example = "zhangsan") private String username; @ApiModelProperty(value = "邮箱", example = "zhangsan@example.com") private String email; // 省略 getter 和 setter }6. 统一响应结构
实际项目中,接口通常返回统一的响应结构。为了让文档更规范,可以这样定义:
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @ApiModel("统一响应结果") public class Result<T> { @ApiModelProperty(value = "状态码", example = "200") private Integer code; @ApiModelProperty(value = "提示信息", example = "操作成功") private String message; @ApiModelProperty(value = "数据") private T data; public static <T> Result<T> success() { return success(null); } public static <T> Result<T> success(T data) { Result<T> result = new Result<>(); result.setCode(200); result.setMessage("操作成功"); result.setData(data); return result; } // 省略 getter 和 setter }7. 分组配置
当项目接口较多时,可以按模块分组展示。在配置类中创建多个Docket实例:
@Configuration public class SwaggerConfig { @Bean public Docket userApi() { return new Docket(DocumentationType.OAS_30) .groupName("用户模块") .select() .apis(RequestHandlerSelectors.basePackage("com.example.controller.user")) .build(); } @Bean public Docket orderApi() { return new Docket(DocumentationType.OAS_30) .groupName("订单模块") .select() .apis(RequestHandlerSelectors.basePackage("com.example.controller.order")) .build(); } }8. 常见问题与解决
在集成过程中,可能会遇到以下常见问题:
- 启动报错:检查依赖版本是否与 Spring Boot 版本兼容,必要时升级或降级。
- 文档页面 404:确认是否放行了 Swagger 相关路径,或在配置中排除拦截。
- 注解不生效:检查是否引入了正确的
io.swagger.annotations包。
9. 总结
本文通过完整的代码实例,介绍了 Swagger 在 Spring Boot 项目中的集成方法、常用注解、分组配置以及常见问题。掌握这些内容后,你就能为项目快速生成规范、可调试的接口文档,提升开发与协作效率。