SpringBoot-使用Swagger文档

前言

Swagger 是一套基于 OpenAPI 规范构建的开源工具,可以帮助我们设计、构建、记录以及使用 Rest API。

pom.xml文件

添加swagger2和swagger-ui依赖。

    <properties>
        <java.version>1.8</java.version>
        <swagger.version>2.9.2</swagger.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--swagger-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>${swagger.version}</version>
        </dependency>
        <!--swagger-ui-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>${swagger.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

配置文件

和整合jpa一样。

server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
  jpa:
    properties:
      hibernate:
        hbm2ddl:
          auto: update
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect
    show-sql: true

swagger2文档信息配置

文档信息配置,Swagger 还支持设置一些文档的版本号、联系人邮箱、网站、版权、开源协议等等信息,通过创建一个 ApiInfo 对象,并且使用 Docket.appInfo() 方法来设置。

@Configuration
@EnableSwagger2
public class Swagger2Config {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.huzh.springbootswagger.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    public ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("spring-boot-demo")
                .description("这是一个简单的 Swagger API 演示")
                .contact(new Contact("企鹅十五号", "https://yuexianhu.github.io", "*****@qq.com"))
                .version("1.0.0-SNAPSHOT")
                .build();
    }
}

实体类

实体描述,我们可以通过 @ApiModel 和 @ApiModelProperty 注解来对我们 API 中所涉及到的对象做描述。

@Entity
@ApiModel(description = "用户实体")
public class User {

    @ApiModelProperty(value = "主键id", hidden = true)
    @GeneratedValue
    @Id
    Integer id;

    @ApiModelProperty(value = "用户名称")
    @NotNull
    @Column
    private String username;

    @ApiModelProperty(value = "用户密码")
    @Column
    private String password;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public User() {
    }

    public User(Integer id, @NotNull String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    public User(@NotNull String username, String password) {
        this.username = username;
        this.password = password;
    }
}

repository类

public interface UserRepository extends JpaRepository<User, Integer> {
    User findById(int id);
}

Controller类

  1. 通过在控制器类上增加@Api 注解,可以给控制器增加描述和标签信息。
  2. 通过在接口方法上增加 @ApiOperation 注解来展开对接口的描述。
@RestController
@RequestMapping("/user")
@Api(tags = "用户操作接口", description = "提供用户相关的 Rest API")
public class UserController {
    @Autowired
    UserRepository userRepository;

    @ApiOperation(value = "获取用户详细信息", notes = "根据用户的id来获取用户详细信息")
    @ApiImplicitParam(name = "id", value = "用户ID", required = true, paramType = "query", dataType = "Integer")
    @GetMapping(value = "/findById")
    public User findById(@RequestParam(value = "id") int id) {
        User user = userRepository.findById(id);
        return user;
    }

    @ApiOperation(value = "获取用户列表", notes = "获取用户列表")
    @GetMapping(value = "/getUserList")
    public List getUserList() {
        return userRepository.findAll();
    }

    @ApiOperation(value = "保存用户", notes = "保存用户")
    @PostMapping(value = "/saveUser")
    public String saveUser(@RequestBody @ApiParam(name = "用户对象", value = "传入json格式", required = true) User user) {
        userRepository.save(user);
        return "success!";
    }

    @ApiOperation(value = "修改用户", notes = "修改用户")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "主键id", required = true, paramType = "query", dataType = "Integer"),
            @ApiImplicitParam(name = "username", value = "用户名称", required = true, paramType = "query", dataType = "String"),
            @ApiImplicitParam(name = "password", value = "用户密码", required = true, paramType = "query", dataType = "String")
    })
    @GetMapping(value = "/updateUser")
    public String updateUser(@RequestParam(value = "id") int id, @RequestParam(value = "username") String username,
                             @RequestParam(value = "password") String password) {
        User user = new User(id, username, password);
        userRepository.save(user);
        return "success!";
    }

    @ApiOperation(value = "删除用户", notes = "根据用户的id来删除用户")
    @ApiImplicitParam(name = "id", value = "用户ID", required = true, paramType = "query", dataType = "Integer")
    @DeleteMapping(value = "/deleteUserById")
    public String deleteUserById(@RequestParam(value = "id") int id) {
        User user = userRepository.findById(id);
        userRepository.delete(user);
        return "success!";
    }
}

访问验证

image.png

高级配置

接口过滤

有些时候我们并不是希望所有的 Rest API 都呈现在文档上,这种情况下 Swagger2 提供给我们了两种方式配置,一种是基于 @ApiIgnore 注解,另一种是在 Docket 上增加筛选。

  1. @ApiIgnore 注解。
    如果想在文档中屏蔽掉删除用户的接口(user/delete),那么只需要在删除用户的方法上加上 @ApiIgnore 即可。
  2. 在 Docket 上增加筛选。
    Docket 类提供了 apis() 和 paths()两个方法来帮助我们在不同级别上过滤接口:
    apis():这种方式我们可以通过指定包名的方式,让 Swagger 只去某些包下面扫描。
    paths():这种方式可以通过筛选 API 的 url 来进行过滤。

自定义响应消息

Swagger 允许我们通过 Docket 的 globalResponseMessage() 方法全局覆盖 HTTP 方法的响应消息,但是首先我们得通过 Docket 的 useDefaultResponseMessages 方法告诉 Swagger 不使用默认的 HTTP 响应消息,假设我们现在需要覆盖所有 GET 方法的 500 和 403 错误的响应消息,我们只需要在 Swagger2Config.java 类中的 Docket Bean 下添加如下内容:

                .useDefaultResponseMessages(false)
                .globalResponseMessage(RequestMethod.GET, newArrayList(
                        new ResponseMessageBuilder()
                                .code(500)
                                .message("服务器发生异常")
                                .responseModel(new ModelRef("Error"))
                                .build(),
                        new ResponseMessageBuilder()
                                .code(403)
                                .message("资源不可用")
                                .build()
                ));

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6bXGDstz-1654485569784)(https://raw.githubusercontent.com/YueXIanHu/blog-images/main/yuexianbolg/20220606111341.png)]

Swagger UI 的使用

接口查看

SwaggerUI 会以列表的方式展示所有扫描到的接口,初始状态是收缩的,我们只需要点击展开就好,而且会在左边标识接口的请求方式(GET、POST、PUT、DELETE 等等)。接口查看

接口调用

  • 点击接口展开后页面右上角的 Try it out 按钮。image.png
  • SwaggerUI 会给我们自动填充请求参数的数据结构,我们需要做的只是点击 Execute 即可发起调用。image.png

Model

SwaggerUI 会通过我们在实体上使用的 @ApiModel 注解以及@ApiModelProperty 注解来自动补充实体以及其属性的描述和备注。model

相关注解说明

Controller 相关注解

  • @Api: 可设置对控制器的描述。
注解属性类型描述
tagsString[]控制器标签。
descriptionString控制器描述(该字段被申明为过期)。

接口相关注解

  • @ApiOperation: 可设置对接口的描述。
注解属性类型描述
valueString接口说明。
notesString接口发布说明。
tagsStirng[]标签。
responseClass<?>接口返回类型。
httpMethodString接口请求方式。
  • @ApiIgnore: Swagger 文档不会显示拥有该注解的接口。
  • @ApiImplicitParams: 用于描述接口的非对象参数集。
  • @ApiImplicitParam: 用于描述接口的非对象参数,一般与 @ApiImplicitParams 组合使用。
注解属性描述
paramType查询参数类型,实际上就是参数放在那里。取值:
path:以地址的形式提交数据,根据 id 查询用户的接口就是这种形式传参。
query:Query string 的方式传参。
header:以流的形式提交。
form:以 Form 表单的形式提交。
dataType参数的数据类型。取值:
Long
String
name参数名字。
value参数意义的描述。
required是否必填。取值:
true:必填参数。
false:非必填参数。

Model 相关注解

  • @ApiModel: 可设置接口相关实体的描述。
  • @ApiModelProperty: 可设置实体属性的相关描述。
注解属性类型描述
valueString字段说明。
nameString重写字段名称。
dataTypeStirng重写字段类型。
requiredboolean是否必填。
exampleStirng举例说明。
hiddenboolean是否在文档中隐藏该字段。
allowEmptyValueboolean是否允许为空。
allowableValuesString该字段允许的值,当我们 API 的某个参数为枚举类型时,使用这个属性就可以清楚地告诉 API 使用者该参数所能允许传入的值。

参考文章

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值