Spring Boot中使用Swagger

news2024/11/15 12:48:03
1. 启用Swagger
1.1 启用注解扫描和文档接口

直接在POM文件引入依赖

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

目前看到的选项有2个:

  • swaager-ui ,访问地址: http://127.0.0.1:18080/swagger-ui.html
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.9.2</version>
    </dependency>
  • swagger-bootstrap-ui ,也叫knife4j ,访问地址: http://127.0.0.1:18080/doc.html
    <dependency>
      <groupId>com.github.xiaoymin</groupId>
      <artifactId>swagger-bootstrap-ui</artifactId>
      <version>${lastVersion}</version>
    </dependency>

我更喜欢swagger-bootstrap-ui的风格

1.3 创建Swagger配置类
    @Configuration
    @EnableSwagger2
    public class SwaggerConfig {

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

        private ApiInfo apiInfo() {
            return new ApiInfoBuilder()
                    .title("标题lws") //标题
                    .description("简介lws") //简介
                    .termsOfServiceUrl("服务条款lws") //服务条款
                    .contact(new Contact("randy", "", "randy@gmail.com"))
                    .version("1.0.lws") //版本
                    .build();
        }
    }

在这里插入图片描述

2. 注解
2.1 @Api

@Api注解在Controller上,通过tags指定指定名称(左侧菜单的名称),tags可以指定多个值,多种使用场景通过指定相同的tag值将所有的API分组在一起。

@Api还有valuedescription属性,description已经@Deprecatedvalue号称会被当成tags值,实际测试下来无效

    @RestController
    @RequestMapping("/v1")
    @Api(tags = {"测试Swagger的注解使用"})
    public class HelloworldController {
    }

在这里插入图片描述

2.2 @ApiOperation

@ApiOperation用于注解到Controller上的方法,对应一个对外提供的接口。目前有4个属性:

属性描述
value对操作的简单说明
notes对操作的详细说明
httpMethodHTTP请求类型,可选:GET HEAD POST PUT DELETE OPTIONS PATCH
codeHTTP状态码,默认为200
produces输出的Content-Type
consumes输入的Content-Type

示例

    @RequestMapping("say")
    @ApiOperation(value = "用于打印用户输入信息", notes = "这是个什么鬼啊啊啊", httpMethod = "GET")
    public String say(@RequestParam("message") String message) {
        return message;
    }

在这里插入图片描述

2.3 @ApiParam
属性描述
name参数名称,因此这个一般应该是字母
value参数说明
defaultValue参数默认值
required参数是否必须

参数类型会通过反射获取,如果参数是基本类型会显示在数据类型字段,如果参数是自定义的类,会同时显示在数据类型schema字段

2.3.1 示例: query param

基本上只有value字段对接收说明有意义, example字段是在页面上调试给的示例值

@RequestMapping("say")
@ApiOperation(value = "用于打印用户输入信息", notes = "这是个什么鬼啊啊啊", httpMethod = "GET")
public String say(@ApiParam(value = "参数描述", example = "10086") @RequestParam("message") Integer message) {
    return "";
}

在这里插入图片描述

2.3.2 示例: 使用请求体,并用一个对象接收参数

使用@RequestBody的场景下,指定@ApiParam唯一有用的属性的value,指定其他参数没有效果

    @PostMapping("say2")
    @ApiOperation(value = "测试请求体", notes = "这是个什么鬼啊啊啊", httpMethod = "POST")
    public String say2(@ApiParam(value = "参数描述") @RequestBody ApFissionLog apFissionLog) {
        return "";
    }

在这里插入图片描述

2.4 @ApiImplicitParams 和 @ApiImplicitParam

@ApiParam相同作用,但是不把注解混合到代码内部,可读性更强,个人更喜欢这种方式

    @PostMapping("say3")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "cavatar",value = "value1",example = "10001", dataType = "int", paramType = "query"),
            @ApiImplicitParam(name = "cnickname",value = "value2",example = "example2", dataType = "string", paramType = "query")
    })
    public String say3(@RequestParam("cavatar") String cavatar, @RequestParam("cnickname") String cnickname) {
        return "";
    }

在这里插入图片描述

2.5 @ApiResponse

定义接口的返回值,示例中say4say5方法的表现基本一致,没发现注解的特殊意义

属性描述
codeHTTP状态码
message状态码的文本描述
response返回值的class
responseContainer返回容器类型时使用,有效值: List Set Map
    @PostMapping("say4")
    public ApFissionLog say4(@RequestParam("cavatar") String cavatar, @RequestParam("cnickname") String cnickname) {
        return new ApFissionLog();
    }

    @PostMapping("say5")
    @ApiResponse(code = 200,message = "返回描述", response = ApFissionLog.class)
    public ApFissionLog say5(@RequestParam("cavatar") String cavatar, @RequestParam("cnickname") String cnickname) {
        return new ApFissionLog();
    }
2.6 @ApiModel和@ApiModelProperty

当请求和响应是POJO的时候特别有用,现实场景中这又是最常用的情况。

@ApiModel用于指定POJO类的描述,提供更可读的类型名称(这个个人觉得没用,直接展示现有类名挺好)。

属性描述
valuemodel的别名,默认为类名
descriptionmodel的详细描述

@ApiModelProperty用于描述POJO里的字段

属性描述
value属性简短描述
example属性的示例值
required是否为必须值
    @PostMapping("say6")
    @ApiOperation(value = "测试请求体", notes = "这是个什么鬼啊啊啊", httpMethod = "POST")
    public ApFissionLog say6(@RequestBody ApFissionLog apFissionLog) {
        return new ApFissionLog();
    }

通过在ApFissionLog类上添加注解


@ApiModel(value = "model类名字", description = "描述信息")
public class ApFissionLog {

    @ApiModelProperty(value = "C用户的昵称", notes = "notes", example = "AAA-BBB-CCC", required = true)
    private String cnickname;
    @ApiModelProperty(value = "C用户的头像", notes = "notes", example = "http://www.aaa.com/avtar.png", required = true)
    private String cavatar;

}

在这里插入图片描述

3. API分组

通过在Swagger的配置类里创建两个Docket对象,扫描不同的包就能完成分组

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean("defaultApi")
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .groupName("分组1")
                .select()
//                .apis(RequestHandlerSelectors.any())
                .apis(RequestHandlerSelectors.basePackage("com.dwpro"))
                .paths(PathSelectors.any())
                .build();
    }

    @Bean("groupApi")
    public Docket createGroupApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .groupName("分组2")
                .select()
//                .apis(RequestHandlerSelectors.any())
                .apis(RequestHandlerSelectors.basePackage("com.dwpro"))
                .paths(PathSelectors.any())
                .build();
    }


    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("标题lws") //标题
                .description("简介lws") //简介
                .termsOfServiceUrl("服务条款lws") //服务条款
                .contact(new Contact("randy", "", "randy@gmail.com"))
                .version("1.0.lws") //版本
                .build();
    }
}

在这里插入图片描述

4. 完整示例
4.1 pom.xml 添加依赖
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.9.2</version>
    </dependency>

    <dependency>
        <groupId>com.github.xiaoymin</groupId>
        <artifactId>swagger-bootstrap-ui</artifactId>
        <version>1.9.6</version>
    </dependency>
4.2 Swagger Config 类
@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean("defaultApi")
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .groupName("分组1")
                .select()
//                .apis(RequestHandlerSelectors.any())
                .apis(RequestHandlerSelectors.basePackage("com.dwpro"))
                .paths(PathSelectors.any())
                .build();
    }

    @Bean("groupApi")
    public Docket createGroupApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .groupName("分组2")
                .select()
//                .apis(RequestHandlerSelectors.any())
                .apis(RequestHandlerSelectors.basePackage("com.dwpro"))
                .paths(PathSelectors.any())
                .build();
    }


    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("标题lws") //标题
                .description("简介lws") //简介
                .termsOfServiceUrl("服务条款lws") //服务条款
                .contact(new Contact("randy", "", "randy@gmail.com"))
                .version("1.0.lws") //版本
                .build();
    }
}

4.3 Controller类
    @RestController
    @RequestMapping("/v1")
    @Api(tags = {"测试Swagger的注解使用"})
    public class HelloworldController {


        @RequestMapping("say1")
        @ApiOperation(value = "用于打印用户输入信息", notes = "这是个什么鬼啊啊啊", httpMethod = "GET")
        public String say1(@ApiParam(value = "参数描述", example = "10086") @RequestParam("message") Integer message) {
            return "";
        }

        @PostMapping("say2")
        @ApiOperation(value = "测试请求体", notes = "这是个什么鬼啊啊啊", httpMethod = "POST")
        public String say2(@ApiParam(value = "参数描述") @RequestBody ApFissionLog apFissionLog) {
            return "";
        }

        @PostMapping("say3")
        @ApiImplicitParams({
                @ApiImplicitParam(name = "cavatar",value = "value1",example = "10001", dataType = "int", paramType = "query"),
                @ApiImplicitParam(name = "cnickname",value = "value2",example = "example2", dataType = "string", paramType = "query")
        })
        public String say3(@RequestParam("cavatar") String cavatar, @RequestParam("cnickname") String cnickname) {
            return "";
        }

        @PostMapping("say4")
        public ApFissionLog say4(@RequestParam("cavatar") String cavatar, @RequestParam("cnickname") String cnickname) {
            return new ApFissionLog();
        }

        @PostMapping("say5")
        @ApiResponse(code = 200,message = "返回描述", response = ApFissionLog.class)
        public ApFissionLog say5(@RequestParam("cavatar") String cavatar, @RequestParam("cnickname") String cnickname) {
            return new ApFissionLog();
        }

        @PostMapping("say6")
        @ApiOperation(value = "测试请求体", notes = "这是个什么鬼啊啊啊", httpMethod = "POST")
        public ApFissionLog say6(@RequestBody ApFissionLog apFissionLog) {
            return new ApFissionLog();
        }


    }
4.4 POJO类
    @Data
    @ApiModel(value = "model类名字", description = "描述信息")
    public class ApFissionLog {

        @ApiModelProperty(value = "C用户的昵称", notes = "notes", example = "AAA-BBB-CCC", required = true)
        private String cnickname;
        @ApiModelProperty(value = "C用户的头像", notes = "notes", example = "http://www.aaa.com/avtar.png", required = true)
        private String cavatar;

    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM与大模型,狭路相逢

编辑&#xff1a;阿冒 设计&#xff1a;沐由 从去年底至今&#xff0c;伴随着OpenAI旗下ChatGPT的火爆&#xff0c;一波AI大模型推动着AI应用全面进入了大模型时代。与此同时&#xff0c;随着边缘算力的提升&#xff0c;AI大模型的部署也逐渐从云端涉入到边缘。 世界对AI算力的…

黑马一站制造数仓实战1

1. 项目目标 一站制造 企业中项目开发的落地&#xff1a;代码开发 代码开发&#xff1a;SQL【DSL SQL】 SparkCore SparkSQL 数仓的一些实际应用&#xff1a;分层体系、建模实现 2. 内容目标 项目业务介绍&#xff1a;背景、需求 项目技术架构&#xff1a;选型、架构 项目环境…

Selenium 自动化高级操作与解决疑难杂症,如无法连接、使用代理等

解决 Selenium 自动化中的常见疑难杂症 这里记录一些关于 Selenium的常用操作和疑难杂症。 有一些细节的知识点就不重复介绍了&#xff0c;因为之前的文章中都有&#xff01; 如果对本文中的知识点有疑问的&#xff0c;可以先阅读我以前分享的文章&#xff01; 知识点&…

1-4、调试汇编程序

语雀原文链接 文章目录 1、执行过程第一步&#xff1a;源程序第二步&#xff1a;编译连接第三步&#xff1a;执行 2、DOSBox运行程序第1步 进入EDIT.EXE第2步 编写源程序第3步 编译第4步 连接第5步 执行完整过程 3、DEBUG跟踪执行过程加载程序到内存执行程序debug和源程序数字…

【导航控制器总结-导航控制器栈 Objective-C语言】

一、导航控制器总结 1.我们接着上一堂课的内容继续 我们上节课说到哪里了,是不是就是对这个导航控制器的一个总结啊 然后,使用的注意事项 2.导航控制器使用注意事项: 1)第一点,使用导航控制器,你在创建的时候,需要给它指定一个根控制器 创建导航控制器的同时,指定…

【译】如何在调试时分析CPU和内存(Analyze CPU and Memory while Debugging)

您想了解如何使您的代码运行得更快&#xff0c;使用更少的内存&#xff0c;或者只是找出您的代码是否有CPU或内存问题?你当然会——你是一名开发人员!但是&#xff0c;内存和性能调优经常会遇到“重要但不紧急”的任务&#xff0c;因为真正紧急的事情&#xff0c;您似乎根本无…

优化 SQL 日志记录的方法

为什么 SQL 日志记录是必不可少的 SQL 日志记录在数据库安全和审计中起着至关重要的作用&#xff0c;它涉及跟踪在数据库上执行的所有 SQL 语句&#xff0c;从而实现审计、故障排除和取证分析。SQL 日志记录可以提供有关数据库如何访问和使用的宝贵见解&#xff0c;使其成为确…

Dockerfile脚本编写流程及示例

学习dockerfile指令 Dockerfile 指令 说明 FROM 指定基础镜像 MAINTAINER 声明镜像的维护者 LABEL 添加元数据标签 RUN 在容器中执行命令 CMD 容器启动后默认执行的命令 EXPOSE 暴露容器的端口 ENV 设置环境变量 ADD 将文件、目录或远程文件添加到容器中 COP…

[ 蓝桥杯Web真题 ]-外卖给好评

目录 介绍 准备 目标 效果 规定 思路 解答参考 介绍 外卖是现代生活中必备的一环。收到外卖后&#xff0c;各大平台软件常常会邀请用户在口味&#xff0c;配送速度等多个方面给与评分。在 element-ui 组件中&#xff0c;已经有相应的 Rate 组件&#xff0c;但是已有组件…

论文解读--PointPillars- Fast Encoders for Object Detection from Point Clouds

PointPillars--点云目标检测的快速编码器 摘要 点云中的物体检测是许多机器人应用(如自动驾驶)的重要方面。在本文中&#xff0c;我们考虑将点云编码为适合下游检测流程的格式的问题。最近的文献提出了两种编码器;固定编码器往往很快&#xff0c;但牺牲了准确性&#xff0c;而…

【latex笔记】双栏格式下插入单栏、双栏格式图片

双栏格式下插入单栏、双栏格式图片 1.缘起multicols2.双栏格式 插入单栏图片3.双栏格式 插入双栏图片 1.缘起multicols 插入双栏格式图片问题被困扰了有很长一段时间&#xff0c;查看网络资源也一直没找到解决方法&#xff0c;今天查看Latex官方文档&#xff0c;才发现因为mul…

spring cloud 整合Feign经行远程调用

文章目录 Feign远程调用Feign替代RestTemplate1&#xff09;引入依赖2&#xff09;添加注解3&#xff09;编写Feign的客户端4&#xff09;测试5&#xff09;总结 自定义配置配置文件方式Java代码方式 Feign使用优化 Feign远程调用 先来看我们以前利用RestTemplate发起远程调用…

将rtsp视频流发送到AWS Kinesis Video Streams的方案——使用Gstreamer(C++) Command Line

大纲 1 创建Kinesis Video Streams1.1 创建视频流1.2 记录Creation Time 2 创建策略2.1 赋予权限2.2 限制资源2.3 Json格式描述&#xff08;或上面手工设置&#xff09;2.4 注意事项 3 创建IAM用户3.1 生成密钥对3.2 附加策略3.3 记录访问密钥对 4 编译C 创建者库5 发送6 检查参…

聊聊 Jetpack Compose 的 “状态订阅自动刷新” -- mutableStateListOf

Jekpack Compose “状态订阅&自动刷新” 系列&#xff1a; 【 聊聊 Jetpack Compose 的 “状态订阅&自动刷新” - - MutableState/mutableStateOf 】 【 聊聊 Jetpack Compose 的 “状态订阅&自动刷新” - - remember 和重组作用域 】 【 聊聊 Jetpack Compose 的 …

非标设计之气缸类型

空压机&#xff1a; 空压机又称空气压缩机&#xff0c;简单来说就是将机械能转化为压力能来进行工作的&#xff0c;空压机在电力行业应用比较多&#xff0c;除了在电力行业应用较多外&#xff0c;其实空压机还有一个比较常见的用途就是用来制冷和分离气体&#xff0c;输送气体…

java SSM毕业生信息管理myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

前言 学校的规模不断扩大&#xff0c;学生数量急剧增加&#xff0c;有关学生的各种信息量也成倍增长。面对庞大的信息量需要有学生信息管理系统来提高学生管理工作的效率。通过这样的系统可以做到信息的规范管理、科学统计和快速查询、修改、增加、删除等&#xff0c;从而减少管…

【力扣热题100】207. 课程表 python 拓扑排序

【力扣热题100】207. 课程表 python 拓扑排序 写在最前面207. 课程表解决方案&#xff1a;判断是否可以完成所有课程的学习方法&#xff1a;拓扑排序实现步骤Python 实现性能分析结论 写在最前面 刷一道力扣热题100吧 难度中等 https://leetcode.cn/problems/course-schedule…

[leetcode ~二叉树] 模版

文章目录 1. 左叶子之和2. 翻转二叉树 E 1. 左叶子之和 :::details 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&…

Proteus仿真--基于1602LCD与DS18B20设计的温度报警器

本文介绍基于1602LCD与DS18B20设计的温度报警器设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 其中温度传感器选用DS18B20器件&#xff0c;主要用于获取温度数据并上传&#xff0c;温度显示1602LCD液晶显示器&#xff0c;报警模块选用蜂鸣器&#…

隐写术和人工智能

在一项新的研究中&#xff0c;人工智能对齐研究实验室 Redwood Research 揭示了大型语言模型 (LLM) 可以掌握“编码推理”&#xff0c;这是一种隐写术形式。 这种有趣的现象使得大型语言模型能够以人类读者无法理解的方式巧妙地将中间推理步骤嵌入到生成的文本中。 大型语言…