springboot整合swagger

Swagger 是一款用于 API 文档生成和测试的强大工具。通过整合 Swagger,可以自动生成 RESTful API 文档,提供 API 的详细说明,并支持在线测试接口。这对于开发、测试和维护 API 非常有帮助。本文将详细介绍如何在 Spring Boot 项目中整合 Swagger2 和 Swagger3,并展示常用的注解和配置示例。

一、整合 Swagger2

1. 添加依赖

在 Spring Boot 项目中添加 Swagger2 的依赖:

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>

2. 配置 Swagger

创建一个配置类 Swagger2Config,用于配置 Swagger2:

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 Swagger2Config {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.hello.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Spring Boot 测试使用 Swagger2 构建 RESTful API")
                .contact(new Contact("cookie", "http://www.baidu.com", "2118119173@qq.com"))
                .version("1.0")
                .description("用户管理 API 文档")
                .build();
    }
}

3. 访问 Swagger UI

启动项目后,访问 http://localhost:8080/swagger-ui.html 即可查看 Swagger UI,所有已配置的 API 将在此展示并可进行测试。

二、整合 Swagger3

1. 添加依赖

在 Spring Boot 项目中添加 Swagger3 的依赖:

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

2. 配置 Swagger

Swagger3 的配置基本与 Swagger2 相同,仍然使用 Swagger2Config 进行配置:

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 Swagger2Config {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.hello.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Spring Boot 测试使用 Swagger3 构建 RESTful API")
                .contact(new Contact("cookie", "http://www.baidu.com", "2118119173@qq.com"))
                .version("1.0")
                .description("用户管理 API 文档")
                .build();
    }
}

3. 访问 Swagger UI

启动项目后,访问 http://localhost:8080/swagger-ui/index.html 即可查看 Swagger3 的 UI 界面,所有已配置的 API 将在此展示并可进行测试。

三、Swagger 常用注解

1. @Api

用于修饰整个类,描述 Controller 的作用。

import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.*;

@Api(value = "部门管理", tags = "部门管理相关接口")
@RestController
@RequestMapping("/dept")
public class DeptController {
    // 相关接口
}

2. @ApiOperation

用于描述一个类的一个方法或接口的作用。

import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/dept")
public class DeptController {

    @ApiOperation("根据部门 ID 获取部门信息")
    @GetMapping("/{id}")
    public Dept getDeptById(@PathVariable("id") Integer id) {
        // 逻辑
        return new Dept();
    }
}

3. @ApiParam

用于描述单个参数的信息。

import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/dept")
public class DeptController {

    @ApiOperation("根据部门 ID 删除部门")
    @DeleteMapping("/{id}")
    public String deleteDeptById(@ApiParam(value = "部门 ID", required = true) @PathVariable("id") Integer id) {
        // 逻辑
        return "删除成功";
    }
}

4. @ApiModel

用于实体类,描述对象的作用。

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

@ApiModel("部门实体类")
public class Dept {
    @ApiModelProperty(value = "部门编号", example = "100")
    private Integer deptno;

    @ApiModelProperty("部门名称")
    private String dname;

    @ApiModelProperty("部门所在地")
    private String loc;

    // Getters and Setters
}

5. @ApiModelProperty

用于描述实体类中字段的作用。

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

@ApiModel("部门实体类")
public class Dept {
    @ApiModelProperty(value = "部门编号", example = "100")
    private Integer deptno;

    @ApiModelProperty("部门名称")
    private String dname;

    @ApiModelProperty("部门所在地")
    private String loc;

    // Getters and Setters
}

6. @ApiResponse 和 @ApiResponses

用于描述 HTTP 响应的信息。

import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/dept")
public class DeptController {

    @ApiOperation("根据部门 ID 获取部门信息")
    @ApiResponses({
        @ApiResponse(code = 200, message = "成功,返回部门信息"),
        @ApiResponse(code = 400, message = "请求参数有误"),
        @ApiResponse(code = 404, message = "未找到指定部门")
    })
    @GetMapping("/{id}")
    public Dept getDeptById(@PathVariable("id") Integer id) {
        // 逻辑
        return new Dept();
    }
}

7. @ApiImplicitParam 和 @ApiImplicitParams

用于描述请求参数的信息,适用于多个参数的情况。

import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/dept")
public class DeptController {

    @ApiOperation("根据地址和名字查询部门")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "dname", value = "部门名称", example = "开发部"),
        @ApiImplicitParam(name = "loc", value = "部门地址", example = "北京")
    })
    @GetMapping("/search")
    public Dept getDeptByDnameAndLoc(@RequestParam("dname") String dname, @RequestParam("loc") String loc) {
        // 逻辑
        return new Dept();
    }
}

四、优化配置和最佳实践

1. 分环境配置 Swagger

在实际开发中,可以根据不同的环境来配置 Swagger 是否启用。通常在开发和测试环境中启用,在生产环境中禁用。可以通过 Spring 的 @Profile 注解来实现。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
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;

@Configuration
@Profile({"dev", "test"})
public class SwaggerConfig {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.hello.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Spring Boot 测试使用 Swagger 构建 RESTful API")
                .contact(new Contact("cookie", "http://www.baidu.com", "2118119173@qq.com"))
                .version("1.0")
                .description("用户管理 API 文档")
                .build();
    }
}

2. 自定义 Swagger UI 样式

Swagger UI 提供了一些自定义的选项,可以通过添加 swagger-ui 的配置文件来实现,比如更改页面标题、添加公司 Logo 等。

src/main/resources/static 下创建 swagger-ui.html 并进行自定义:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>API 文档</title>
    <link rel="icon" type="image/png" href="https://example.com/logo.png">
    <link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700|Source+Code+Pro:400,700" rel="stylesheet">
    <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/swagger-ui-dist/swagger-ui.css">
</head>
<body>
<div id="swagger-ui"></div>
<script src="https://cdn.jsdelivr.net/npm/swagger-ui-dist/swagger-ui-bundle.js"></script>
<script>
    window.onload = function() {
        const ui = SwaggerUIBundle({
            url: "/v2/api-docs",
            dom_id: '#swagger-ui',
            presets: [
                SwaggerUIBundle.presets.apis,
                SwaggerUIBundle.SwaggerUIStandalonePreset
            ],
            layout: "BaseLayout",
            deepLinking: true,
            docExpansion: "none"
        });
        window.ui = ui;
    };
</script>
</body>
</html>

3. 使用 Swagger 扩展注解

Swagger 还提供了一些扩展注解,用于更加详细地描述 API,比如 @ApiModelProperty 的 hidden 属性用于隐藏某些字段,@ApiResponses 的 examples 属性用于提供示例响应等。

@ApiModel("用户实体类")
public class User {
    @ApiModelProperty(value = "用户 ID", example = "1", hidden = true)
    private Long id;

    @ApiModelProperty(value = "用户名", example = "张三")
    private String username;

    @ApiModelProperty(value = "密码", example = "123456", hidden = true)
    private String password;

    // Getters and Setters
}
@ApiOperation("根据用户 ID 获取用户信息")
@ApiResponses({
    @ApiResponse(code = 200, message = "成功", response = User.class),
    @ApiResponse(code = 404, message = "未找到用户", examples = @Example(@ExampleProperty(mediaType = "application/json", value = "{ \"message\": \"未找到用户\" }")))
})
@GetMapping("/{id}")
public User getUserById(@PathVariable("id") Long id) {
    // 逻辑
    return new User();
}

总结

通过以上内容的介绍,您可以在 Spring Boot 项目中轻松整合 Swagger2 和 Swagger3,并掌握 Swagger 常用的注解和配置技巧。在实际项目中,使用 Swagger 生成 API 文档不仅能提高开发效率,还能使得 API 的使用更加规范和透明。希望本文能对您有所帮助,祝您在 API 开发和维护过程中更加顺利。

完整的代码示例和更多详细信息可以参考 Swagger 官方文档 和 Springfox 文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值