【Spring Boot】Swagger的常用注解

  1. 在Swagger的开发过程中,我们需要在Controller代码等处添加相应的注解,以便可以提高生成的接口文档的可读性
  2. 为了解决这些问题,Swagger提供了很多的注解,通过这些注解,我们可以更好更清晰的描述我们的接口,包含接口的请求参数、响应数据、数据模型等信息。其核心的注解主要包含以下信息:
    1. 注解位置说明
      @Api加载Controller类上,表示对类的说明
      @ApiModel类(通常是实体类)描述实体类的作用
      @ApiModelProperty属性描述实体类的属性
      @ApiOperation方法说明方法的用途、作用
      @ApiImplicitParams方法表示一组参数说明
      @ApiImplicitParam方法用在@ApiImplicitParams注解中,指定一个请求参数的各个方面的属性
  3. 示例用法
    1. 描述实体类:使用注解@ApiModel、@ApiModelProperty来描述实体类及其类的属性
      1. package com.app.studypro.entity;import com.baomidou.mybatisplus.annotation.FieldFill;
        import com.baomidou.mybatisplus.annotation.TableField;
        import io.swagger.annotations.ApiModel;
        import io.swagger.annotations.ApiModelProperty;
        import lombok.Data;
        import lombok.experimental.Delegate;import java.io.Serializable;
        import java.time.LocalDateTime;/*** 用户信息** @author Administrator*/
        @Data
        @ApiModel("用户信息")
        public class User implements Serializable {private static final long serialVersionUID = 1L;/*** 主键*/@ApiModelProperty("主键")private Long id;/*** 用户名*/@ApiModelProperty("用户名")private String username;/*** 密码*/@ApiModelProperty("密码")private String password;/*** 性别*/@ApiModelProperty("性别")private String sex;/*** 状态 0:禁用,1:正常*/@ApiModelProperty("状态 0:禁用,1:正常")private Integer status;/*** 创建时间*/@ApiModelProperty("创建时间")@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;/*** 更新时间*/@ApiModelProperty("更新时间")@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;/*** 创建人*/@ApiModelProperty("创建人")@TableField(fill = FieldFill.INSERT)private Long createUser;/*** 修改人*/@ApiModelProperty("修改人")@TableField(fill = FieldFill.INSERT_UPDATE)private Long updateUser;/*** 是否删除*/@ApiModelProperty("是否删除")@Delegateprivate Integer isDeleted;}
        
      2. package com.app.studypro.common;import io.swagger.annotations.ApiModel;
        import io.swagger.annotations.ApiModelProperty;
        import lombok.Data;import java.io.Serializable;
        import java.util.HashMap;
        import java.util.Map;@Data
        @ApiModel("返回接口")
        public class ResultBean<T> implements Serializable {private static final long serialVersionUID = -6759928086797729382L;/*** 编码:1成功,0和其它数字为失败*/@ApiModelProperty("编码:1成功,0和其它数字为失败")private Integer code;/*** 错误信息*/@ApiModelProperty("错误信息")private String msg;/*** 数据*/@ApiModelProperty("数据")private T data;/*** 动态数据*/@ApiModelProperty("动态数据")private Map map = new HashMap();public static <T> ResultBean<T> success(T object) {ResultBean<T> r = new ResultBean<T>();r.data = object;r.code = 1;return r;}public static <T> ResultBean<T> error(String msg) {ResultBean r = new ResultBean();r.msg = msg;r.code = 0;return r;}public ResultBean<T> add(String key, Object value) {this.map.put(key, value);return this;}}
        
    2. 描述controller类、方法及其方法参数:可以使用注解@Api、 @ApiOperation、@ApiImplicitParams、@ApiImplicitParam
      1. package com.app.studypro.controller;import com.app.studypro.common.ResultBean;
        import com.app.studypro.entity.User;
        import com.app.studypro.service.UserService;
        import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
        import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
        import io.swagger.annotations.Api;
        import io.swagger.annotations.ApiImplicitParam;
        import io.swagger.annotations.ApiImplicitParams;
        import io.swagger.annotations.ApiOperation;
        import lombok.extern.slf4j.Slf4j;
        import org.apache.commons.lang.StringUtils;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.cache.annotation.CacheEvict;
        import org.springframework.cache.annotation.CachePut;
        import org.springframework.cache.annotation.Cacheable;
        import org.springframework.util.DigestUtils;
        import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;@RestController
        @RequestMapping("/users")
        @Slf4j
        @Api(tags = "用户管理接口")
        public class UserController {@Autowiredprivate UserService userService;/*** 用户登录** @param request* @param user* @return*/@PostMapping("/login")@ApiOperation(value = "用户登录")public ResultBean<User> login(HttpServletRequest request, @RequestBody User user) {return ResultBean.success(sqlUser);}/*** 用户退出** @param request* @return*/@PostMapping("/logout")@ApiOperation(value = "用户退出")public ResultBean<String> logout(HttpServletRequest request) {return ResultBean.success("退出成功");}/*** 新增账号* 设置缓存名称为user-cache,将当前缓存名称的缓存全部失效** @param user* @return*/@CachePut(value = "userCache", key = "#result.data.id")@PostMapping@ApiOperation(value = "新增账号")public ResultBean<User> save(HttpServletRequest request, @RequestBody User user) {return ResultBean.success(user);}/*** 根据id修改用户信息** @param user* @return*/@ApiOperation(value = "根据id修改用户信息")@CacheEvict(value = "userCache", allEntries = true)@PutMappingpublic ResultBean<String> update(HttpServletRequest request, @RequestBody User user) {return ResultBean.success("用户信息修改成功");}/*** 根据id查询用户信息** @param id* @return*/@ApiOperation(value = "根据id查询用户信息")@Cacheable(value = "userCache3", key = "#id")@GetMapping("/{id}")public ResultBean<User> getById(@PathVariable Long id) {return ResultBean.error("没有查询到对应用户信息");}/*** 用户信息分页** @param page     当前页* @param pageSize 每页显示条数* @param username 用户名* @return 返回分页用户信息*/@ApiOperation(value = "用户信息分页")@ApiImplicitParams({@ApiImplicitParam(name = "page", value = "当前页", required = true),@ApiImplicitParam(name = "pageSize", value = "每页显示条数", required = true),@ApiImplicitParam(name = "username", value = "用户名", required = false)})@GetMapping("/page")@Cacheable(value = "userCache", key = "#page+'_'+#pageSize+'_'+#username", unless = "#result.data.total==0")public ResultBean<Page<User>> page(int page, int pageSize, String username) {return ResultBean.success(pageInfo);}}
        
  4. 重启web服务之后,再访问接口文档的页面,我们可以发现接口文档中存在很多增加可读性的有效的接口信息。可以看出接口的中文描述,清晰的看到每一个接口是做什么的,接口方法参数什么含义,参数是否是必填的,响应结果的参数是什么含义等信息,都可以清楚的描述出来。这样来说,我们若是想要清晰的描述一个接口,就需要借助于Swagger给我们提供的注解

    1. ​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/223067.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kotlin学习之集合

原文链接 Kotlin Collections 现代的软件一般比较复杂&#xff0c;程序语言中的基本数据类型往往不能满足需要&#xff0c;除了基本的数据类型以外&#xff0c;还有对象的容器也非常的重要&#xff0c;比如线性容器&#xff08;数组&#xff0c;列表和Set&#xff09;和二维容…

线性分类器--图像表示

整个模型 图像表示 二进制图像 灰度图像 彩色图像 大多数分类算法都要求输入向量&#xff01; rbg的图像矩阵转列向量 大小为 32X32 的话&#xff0c;图像矩阵转列向量是多少维&#xff1f; 32x32x3 3072 维列向量

Failed to load resource: the server responded with a status of 404 ()

路径问题&#xff1a; 路径省略前面的http://localhost:8080/ 就行了。

[Spring ~必知必会] Bean 基础常识汇总

文章目录 Bean 相关到底什么是beanFactorybeanFactory能干啥ApplicationContext是什么ApplicationContext的功能比 BeanFactory多了什么 容器的实现BeanFactory的实现ApplicationContext的实现xml 配置配置类配置 Bean 的生命周期3.1 Bean 的常见的后处理器测试代码总结 3.2 工…

vue day2

1、指令修饰符&#xff1a;.指明一些指令后缀&#xff0c;不同后缀封装不同处理操作 按键修饰符&#xff1a;keyup.enter v-model修饰符&#xff1a; v-model.trim&#xff1a;去首位空格 v-model.number&#xff1a;转数字 事件修饰符&#xff1a; 阻止事件冒泡&#xff1…

【vue2】axios请求与axios拦截器的使用详解

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;当我们在路由跳转前与后我们可实现触发的操作 【前言】ajax是一种在javaScript代码中发请…

Dockerfile讲解

Dockerfile 1. 构建过程解析2. Dockerfile常用保留字指令3. 案例3.1. 自定义镜像mycentosjava83.2. 虚悬镜像 4. Docker微服务实战 dockerfile是用来构建docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本。 dockerfile定义了进程需要的一切东西&…

详解Java中的泛型(泛型的语法,擦除机制,泛型的上界)

目录 一.什么是泛型 二.Java中为什么要使用泛型 三.泛型的语法 四.泛型类的使用 五.泛型的编译机制&#xff08;擦除机制&#xff09; 六.泛型的上界 一.什么是泛型 泛型&#xff08;Generics&#xff09;是Java SE 5中引入的一个新特性&#xff0c;可以使Java中的类和方…

【JavaEE】多线程 (1)

目录 1. 认识线程&#xff08;Thread&#xff09; 1) 线程是什么 2) 为啥要有线程 3) 进程和线程的区别 2.第⼀个多线程程序 3.多线程的其他创建方式 方法二:实现 Runnable 接⼝ 方法三:匿名内部类 方法四:实现Runable, 重写run, 匿名内部类 方法五:使用lambda表达式…

【青蛙跳台阶问题 —— (三种算法)】

青蛙跳台阶问题 —— (三种算法&#xff09; 一.题目介绍1.1.题目1.2.图示 二.解题思路三.题解及其相关算法3.1.递归分治法3.2.动态规划算法&#xff08;Dynamic Programming&#xff09;3.3.斐波那契数列法 四.注意细节 一.题目介绍 1.1.题目 一只青蛙一次可以跳上1级台阶&am…

C++ :静态成员

静态成员 静态成员就是在成员变量和成员函数前加上关键字 static &#xff0c;称为静态成员 静态成员分为&#xff1a; 静态成员变量 1.所有对象共享同一份数据 2.在编译阶段分配内存 3.类内声明&#xff0c;类外初始化 静态成员函数 1.所有对象共享同一个函数 2.静态成…

CSGO搬砖还能做吗?CSGO饰品未来走势如何?

steam/csgo搬砖项目真能月入过万吗&#xff1f;到底真的假的&#xff1f; 如何看待CSGO饰品市场的整体走向&#xff1f; 从整体来说&#xff0c;CSGO的饰品市场与规模肯定会持续不断的上升&#xff0c;大盘不会发生特别大的波动&#xff0c;目前处于稳定期&#xff01;&…