【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("是否删除")
            @Delegate
            private 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 {
        
            @Autowired
            private 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)
            @PutMapping
            public 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. ​​​​​​​

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何运用AppLink平台中的数据连接器组件

AppLink平台组件组成 AppLink平台组件分成三个板块触发事件组件、基础组件和数据连接器 数据连接器组件里面有10个组件&#xff0c;目前也在不断新增更多的数据连接器&#xff0c;那他们在AppLink平台里的原理、触发动作以及怎么使用呢&#xff1f;接下来用MySQL和TimescaleD…

探索接口测试:SOAP、RestFul规则、JMeter及市面上的接口测试工具

引言 在当今软件开发领域&#xff0c;接口测试扮演着至关重要的角色。随着系统变得日益复杂和互联&#xff0c;对于内部和外部接口的测试变得愈发关键。接口测试不仅仅是验证接口的正确性&#xff0c;更是确保系统的稳定性、安全性和性能优越性的关键一环。 本篇博客将带您深入…

2024 年应该使用 Bun、Node.js 还是 Deno

2024 年应该使用 Bun、Node.js 还是 Deno 到 2024 年&#xff0c;构建基于 JavaScript 的现代 API 相对简单。我们可以使用Express.js等库并在几分钟内启动可用的 API。但是&#xff0c;现在最具挑战性的部分是选择正确的 JavaScript 引擎。 目前主流的三个运行时是&#xff…

【Redis缓存】RedisTemplate如何获取符合要求的key,批量获取key

RedisTemplate如何获取符合要求的key,批量获取key 一、方法/命令二、数据使用 一、方法/命令 如果使用命令的形式&#xff0c;输入以下命令即可 keys *如果使用RedisTemplate&#xff0c;则方法为 redisTemplate.keys()获取所有符合条件的key。 二、数据使用 redis中缓存了…

西南科技大学数字电子技术实验一(数字信号基本参数与逻辑门电路功能测试及FPGA 实现 )预习报告

手写报告稍微认真点写&#xff0c;80随便有 目录 一、计算/设计过程 1、通过虚拟示波器观察和测量信号 2、通过实际电路&#xff08;电阻、开关、发光二极管&#xff09;模拟逻辑门电路 二、画出并填写实验指导书上的预表 三、画出并填写实验指导书上的虚表 四、粘贴原理…

Kafka 保证消息消费全局顺序性

当有消息被生产出来的时候&#xff0c;如果没有指定分区或者指定 key &#xff0c;那么消费会按照【轮询】的方式均匀地分配到所有可用分区中&#xff0c;但不一定按照分区顺序来分配 我们知道&#xff0c;在 Kafka 中消费者可以订阅一个或多个主题&#xff0c;并被分配一个或多…

前端页面带值跳转

前端页面带值跳转 querry>url searchParamers,url后附加参数&#xff0c;传递的值长度与有限vuex&#xff08;全局状态管理&#xff09;&#xff0c;搜索页面将关键词塞到状态中&#xff0c;所搜结果页从状态取值。 使用axios整合前后端 axios官网&#xff1a;axios 在前…

SpringCloud--分布式事务实现

一、分布式事务 首先要明白事务是指数据库中的一组操作&#xff0c;这些操作要么全部成功执行&#xff0c;要么全部不执行&#xff0c;以保持数据的一致性和完整性。在本地事务中&#xff0c;也就是传统的单机事务&#xff0c;必须要满足原子性(Atomicity)、一致性(Consistenc…

计算机组成原理——存储器(主存容量扩展)

对于字扩展与位扩展的解释&#xff1a; 计算机原理中的字&#xff0c;位扩展&#xff0c;都给老子进来学&#xff0c;看不懂算我输&#xff01; 如果主存的容量无法满足 CPU 的需求&#xff0c;可以通过存储器扩展来解决&#xff0c;扩展的方式有两种&#xff1a; 主存的位数…

“职场中的‘特色人物’:与‘个性’领导和同事的碰撞与成长“

文章目录 每日一句正能量前言程序员是怎么和产品经理battle的&#xff1f;科班程序员非科班程序员 程序员的团队合作密码&#xff1a;协作与领导的艺术职场人际关系的技巧后记 每日一句正能量 乌云的背后是阳光&#xff0c;阳光的背后是彩虹。 前言 在职场中&#xff0c;我们都…

训练 CNN 对 CIFAR-10 数据中的图像进行分类

1. 加载 CIFAR-10 数据库 import keras from keras.datasets import cifar10# 加载预先处理的训练数据和测试数据 (x_train, y_train), (x_test, y_test) cifar10.load_data() 2. 可视化前 24 个训练图像 import numpy as np import matplotlib.pyplot as plt %matplotlib …

Python网络爬虫练习

爬取历年中国大学排名(前20名)&#xff0c;并随机选取一所高校画图展示其历年总分变化,并计算平均分&#xff0c;在图上展示该平均分直线&#xff1a; 代码如下&#xff1a; import matplotlib.pyplot as plt import pandas as pd import requests import randomdef main(yea…

蓝桥杯day01——根据给定数字划分数组

题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 pivot 。请你将 nums 重新排列&#xff0c;使得以下条件均成立&#xff1a; 所有小于 pivot 的元素都出现在所有大于 pivot 的元素 之前 。所有等于 pivot 的元素都出现在小于和大于 pivot 的元素 中间 。小于 piv…

代码随想录算法训练营 ---第四十八天

第一题&#xff1a; 简介&#xff1a; 注&#xff1a;本题简介是我的思路&#xff0c;题解思路看下方。 动态规划五部曲&#xff1a; 1.确定dp数组的含义 //dp[i]表示 偷到第i家能偷到的最大金额 for(int i2;i<nums.size();i){if(i-3>0)dp[i] max(dp[i-2],dp[i-3])nu…

智慧城市交通大屏|助力解决城市交通问题

2017年起&#xff0c;数字孪生连续三年被Gartner列入“未来科技十大趋势”&#xff0c;由此可见数字孪生技术正屹立在数字化发展的风口之中。 数字孪生作为物理世界的数字映射&#xff0c;将流程、物体的信息利用数字技术实时映射到系统中&#xff0c;可以对某个设备、某个企业…

【挑战业余一周拿证】二、在云中计算 - 第 3 节 - Amazon EC2 定价

目录 第 3 节 - Amazon EC2 定价 一、按需 适用场景 二、Savings Plans 适用场景 三、预留实例 三种付款模式 四、Spot 实例 适用场景 五、专用主机 适用场景 关注订阅号 首页&#xff1a;【挑战业余一周拿证】AWS 认证云从业者 - 基础 课程目录&#xff1a;【挑…

网站纪念哀悼主题风格

前言 在许多情况下&#xff0c;为了表达对逝者的怀念和哀悼&#xff0c;网站会将其风格调整为黑白色。这种做法在一些网站中非常常见&#xff0c;包括一些社交媒体平台和新闻网站等。 当一个网站将其风格调整为黑白色时&#xff0c;这通常意味着它正在为一些悲伤的事件或纪念日…

leetCode 77.组合 + 回溯算法 (bactracking) + 剪枝 + 图解 + 笔记

77. 组合 - 力扣&#xff08;LeetCode&#xff09; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] …

消失的数字,旋转数组(leetcode 一题多解)

目录 一、消失的数字 思路一&#xff08;暴力求解&#xff09;代码实现&#xff1a; 思路二&#xff08;数列的思想&#xff09;代码实现&#xff1a; 思路三&#xff08;异或的运用&#xff09;代码实现&#xff1a; 二、轮转数组 思路一&#xff08;暴力求解&#xff09…

线上异步任务突然不能回写100%

项目场景&#xff1a; 需求是一个作业&#xff0c;需要运行一组sql&#xff0c;所有sql运行完成&#xff0c;更新作业进度为100%&#xff0c;状态为完成。sql需要是在大数据平台&#xff0c;通过yarn调度&#xff0c;异步执行。 kafka监听每个sql的执行状态&#xff0c;所有sql…