Spring-Boot-集成-Swagger-UI-详细教程
目录
Spring Boot 集成 Swagger UI 详细教程
1. 什么是Swagger?
Swagger是一个用于设计、构建、记录和使用RESTful Web服务的开源软件框架。Swagger UI提供了一个可视化的界面,让你能够:
- 查看API文档
- 在线测试API接口
- 自动生成接口文档
2. 环境准备
2.1 必要工具
- JDK 8 或更高版本
- Maven 3.6+ 或 Gradle 6+
- IDE(IntelliJ IDEA、Eclipse等)
2.2 Spring Boot版本说明
- Spring Boot 2.x 使用 Springfox
- Spring Boot 3.x 使用 Springdoc OpenAPI
3. 方案一:Spring Boot 2.x + Springfox(推荐新手)
3.1 创建Spring Boot项目
使用Spring Initializr创建项目
访问 或使用IDE创建项目,选择以下依赖:
- Spring Web
- Spring Boot DevTools(可选)
或使用Maven命令创建
mvn archetype:generate -DgroupId=com.example -DartifactId=swagger-demo \
-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
3.2 添加Maven依赖
在 pom.xml
文件中添加以下依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.14</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>swagger-demo</artifactId>
<version>1.0.0</version>
<name>swagger-demo</name>
<description>Spring Boot Swagger Demo</description>
<properties>
<java.version>8</java.version>
</properties>
<dependencies>
<!-- Spring Boot Web Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Swagger UI -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>3.0.0</version>
</dependency>
<!-- Swagger 2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>3.0.0</version>
</dependency>
<!-- Spring Boot Starter Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.3 创建Swagger配置类
创建 src/main/java/com/example/config/SwaggerConfig.java
:
package com.example.config;
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.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
/**
* 创建API文档
*/
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
// API基本信息
.apiInfo(apiInfo())
// 选择那些路径和api会生成document
.select()
// 对所有api进行监控
.apis(RequestHandlerSelectors.basePackage("com.example.controller"))
// 对所有路径进行监控
.paths(PathSelectors.any())
.build();
}
/**
* API信息
*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Spring Boot Swagger Demo API文档")
.description("这是一个Spring Boot集成Swagger的示例项目")
.contact(new Contact("开发者", "https://example.com", "developer@example.com"))
.version("1.0.0")
.build();
}
}
3.4 创建实体类
创建 src/main/java/com/example/entity/User.java
:
package com.example.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel(description = "用户信息")
public class User {
@ApiModelProperty(value = "用户ID", example = "1")
private Long id;
@ApiModelProperty(value = "用户名", example = "张三", required = true)
private String username;
@ApiModelProperty(value = "邮箱", example = "zhangsan@example.com")
private String email;
@ApiModelProperty(value = "年龄", example = "25")
private Integer age;
// 无参构造函数
public User() {}
// 有参构造函数
public User(Long id, String username, String email, Integer age) {
this.id = id;
this.username = username;
this.email = email;
this.age = age;
}
// Getter和Setter方法
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
3.5 创建Controller
创建 src/main/java/com/example/controller/UserController.java
:
package com.example.controller;
import com.example.entity.User;
import io.swagger.annotations.*;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/api/users")
@Api(tags = "用户管理", description = "用户相关的API")
public class UserController {
// 模拟数据库
private List<User> users = new ArrayList<>();
private Long idCounter = 1L;
// 初始化一些数据
{
users.add(new User(idCounter++, "张三", "zhangsan@example.com", 25));
users.add(new User(idCounter++, "李四", "lisi@example.com", 30));
}
@ApiOperation(value = "获取所有用户", notes = "返回系统中的所有用户列表")
@ApiResponses({
@ApiResponse(code = 200, message = "成功获取用户列表"),
@ApiResponse(code = 500, message = "服务器内部错误")
})
@GetMapping
public List<User> getAllUsers() {
return users;
}
@ApiOperation(value = "根据ID获取用户", notes = "根据用户ID获取特定用户信息")
@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long", paramType = "path", example = "1")
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
User user = users.stream()
.filter(u -> u.getId().equals(id))
.findFirst()
.orElse(null);
if (user != null) {
return ResponseEntity.ok(user);
} else {
return ResponseEntity.notFound().build();
}
}
@ApiOperation(value = "创建新用户", notes = "在系统中创建一个新的用户")
@ApiImplicitParam(name = "user", value = "用户信息", required = true, dataType = "User")
@PostMapping
public User createUser(@RequestBody User user) {
user.setId(idCounter++);
users.add(user);
return user;
}
@ApiOperation(value = "更新用户信息", notes = "更新指定ID的用户信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long", paramType = "path"),
@ApiImplicitParam(name = "user", value = "更新的用户信息", required = true, dataType = "User")
})
@PutMapping("/{id}")
public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User updatedUser) {
for (int i = 0; i < users.size(); i++) {
User user = users.get(i);
if (user.getId().equals(id)) {
updatedUser.setId(id);
users.set(i, updatedUser);
return ResponseEntity.ok(updatedUser);
}
}
return ResponseEntity.notFound().build();
}
@ApiOperation(value = "删除用户", notes = "根据用户ID删除用户")
@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long", paramType = "path")
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
boolean removed = users.removeIf(user -> user.getId().equals(id));
if (removed) {
return ResponseEntity.ok().build();
} else {
return ResponseEntity.notFound().build();
}
}
}
3.6 创建启动类
创建 src/main/java/com/example/SwaggerDemoApplication.java
:
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SwaggerDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SwaggerDemoApplication.class, args);
System.out.println("应用启动成功!");
System.out.println("Swagger UI访问地址: http://localhost:8080/swagger-ui.html");
}
}
3.7 配置文件
创建 src/main/resources/application.properties
:
# 应用名称
spring.application.name=swagger-demo
# 服务器端口
server.port=8080
# 日志配置
logging.level.root=INFO
logging.level.com.example=DEBUG
# Swagger配置(可选)
# 禁用swagger,生产环境建议设置为true
swagger.enabled=true
3.8 运行项目
方法1:使用IDE运行
- 在IDE中右键点击
SwaggerDemoApplication.java
- 选择 “Run SwaggerDemoApplication”
方法2:使用Maven命令运行
# 编译项目
mvn clean compile
# 运行项目
mvn spring-boot:run
方法3:打包运行
# 打包
mvn clean package
# 运行jar包
java -jar target/swagger-demo-1.0.0.jar
3.9 访问Swagger UI
启动成功后,在浏览器中访问:
http://localhost:8080/swagger-ui.html
你会看到一个漂亮的API文档界面!
4. 方案二:Spring Boot 3.x + Springdoc OpenAPI(推荐)
4.1 Maven依赖(Spring Boot 3.x)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.2</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>swagger-demo-v3</artifactId>
<version>1.0.0</version>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Springdoc OpenAPI UI -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
4.2 OpenAPI配置类
package com.example.config;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class OpenApiConfig {
@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.info(new Info()
.title("Spring Boot 3 + OpenAPI 3")
.version("1.0.0")
.description("Spring Boot 3 集成 OpenAPI 3 示例")
.contact(new Contact()
.name("开发者")
.url("https://example.com")
.email("developer@example.com")));
}
}
4.3 使用OpenAPI 3注解的Controller
package com.example.controller;
import com.example.entity.User;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/api/v3/users")
@Tag(name = "用户管理", description = "用户相关的API接口")
public class UserControllerV3 {
private List<User> users = new ArrayList<>();
private Long idCounter = 1L;
{
users.add(new User(idCounter++, "张三", "zhangsan@example.com", 25));
users.add(new User(idCounter++, "李四", "lisi@example.com", 30));
}
@Operation(summary = "获取所有用户", description = "返回系统中的所有用户列表")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "成功获取用户列表",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = User.class))),
@ApiResponse(responseCode = "500", description = "服务器内部错误")
})
@GetMapping
public List<User> getAllUsers() {
return users;
}
@Operation(summary = "根据ID获取用户", description = "根据用户ID获取特定用户信息")
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(
@Parameter(description = "用户ID", required = true, example = "1")
@PathVariable Long id) {
User user = users.stream()
.filter(u -> u.getId().equals(id))
.findFirst()
.orElse(null);
return user != null ? ResponseEntity.ok(user) : ResponseEntity.notFound().build();
}
@Operation(summary = "创建新用户", description = "在系统中创建一个新的用户")
@PostMapping
public User createUser(@RequestBody User user) {
user.setId(idCounter++);
users.add(user);
return user;
}
}
4.4 OpenAPI 3实体类注解
package com.example.entity;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "用户信息")
public class User {
@Schema(description = "用户ID", example = "1")
private Long id;
@Schema(description = "用户名", example = "张三", requiredMode = Schema.RequiredMode.REQUIRED)
private String username;
@Schema(description = "邮箱", example = "zhangsan@example.com")
private String email;
@Schema(description = "年龄", example = "25")
private Integer age;
// 构造函数和getter/setter省略...
}
4.5 配置文件(Spring Boot 3.x)
# 应用配置
spring.application.name=swagger-demo-v3
server.port=8080
# OpenAPI文档配置
springdoc.api-docs.path=/api-docs
springdoc.swagger-ui.path=/swagger-ui.html
springdoc.swagger-ui.operationsSorter=method
# 包扫描路径
springdoc.packages-to-scan=com.example.controller
5. 测试Swagger UI功能
5.1 访问文档
- Springfox (Spring Boot 2.x): http://localhost:8080/swagger-ui.html
- Springdoc (Spring Boot 3.x): http://localhost:8080/swagger-ui.html
5.2 测试API接口
-
GET请求测试
- 点击 “GET /api/users”
- 点击 “Try it out”
- 点击 “Execute”
-
POST请求测试
- 点击 “POST /api/users”
- 点击 “Try it out”
- 在请求体中输入JSON数据:
{ "username": "王五", "email": "wangwu@example.com", "age": 28 }
- 点击 “Execute”
-
PUT/DELETE请求测试
- 类似操作,填写必要的参数
6. 常见问题和解决方案
6.1 Swagger UI无法访问
问题: 访问swagger-ui.html显示404错误
解决方案:
- 检查依赖是否正确添加
- 确认配置类是否有
@EnableSwagger2
注解 - 检查Controller包路径配置
6.2 接口不显示
问题: Swagger UI中看不到自定义的接口
解决方案:
// 检查包扫描路径
.apis(RequestHandlerSelectors.basePackage("com.example.controller"))
6.3 生产环境禁用Swagger
@Configuration
@EnableSwagger2
@Profile("!prod") // 生产环境不加载
public class SwaggerConfig {
// 配置内容
}
或使用配置文件:
# application-prod.properties
springfox.documentation.enabled=false
6.4 中文乱码问题
# application.properties
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
7. 高级配置
7.1 添加认证配置
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.controller"))
.paths(PathSelectors.any())
.build()
.securitySchemes(securitySchemes())
.securityContexts(securityContexts());
}
private List<ApiKey> securitySchemes() {
return Lists.newArrayList(
new ApiKey("JWT", "Authorization", "header"));
}
private List<SecurityContext> securityContexts() {
return Lists.newArrayList(
SecurityContext.builder()
.securityReferences(defaultAuth())
.forPaths(PathSelectors.regex("/api/.*"))
.build()
);
}
7.2 自定义响应模型
@ApiModel("统一响应结果")
public class ApiResponse<T> {
@ApiModelProperty("响应代码")
private Integer code;
@ApiModelProperty("响应消息")
private String message;
@ApiModelProperty("响应数据")
private T data;
// 构造函数和getter/setter
}
8. 最佳实践
8.1 注解使用建议
- 为所有Controller类添加
@Api
注解 - 为所有接口方法添加
@ApiOperation
注解 - 为实体类字段添加
@ApiModelProperty
注解 - 合理使用
@ApiImplicitParam
和@ApiParam
8.2 文档维护
- 定期更新API文档描述
- 保持示例数据的准确性
- 及时更新版本信息
8.3 安全考虑
- 生产环境禁用Swagger UI
- 对敏感接口添加适当的安全配置
- 不要在文档中暴露敏感信息
总结
通过以上步骤,你已经成功集成了Swagger UI到Spring Boot项目中。现在你可以:
- ✅ 自动生成API文档
- ✅ 在线测试API接口
- ✅ 提供给前端开发人员参考
- ✅ 提高开发效率
记住选择适合你Spring Boot版本的方案:
- Spring Boot 2.x 使用 Springfox
- Spring Boot 3.x 使用 Springdoc OpenAPI
开始使用Swagger,让你的API文档变得生动起来吧!