Spring Boot整合Swagger3.0及Knife4j

news2024/11/25 20:47:47

一、什么是 Swagger

Swagger是一组围绕 OpenAPI 规范构建的开源工具,可帮助您设计、构建、记录和使用 REST API。主要的 Swagger 工具包括:

  1. Swagger Editor – 基于浏览器的编辑器,您可以在其中编写 OpenAPI 规范。

  2. Swagger UI – 将 OpenAPI规范呈现为交互式 API 文档。

  3. swagger2于17年停止维护,现在最新的版本为 Swagger3(Open Api3)。

二、什么是knife4j

knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望她能像一把匕首一样小巧,轻量,并且功能强悍!

三、依赖引入

  • springfox引入方式
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>
  • knife4j引入方式
<dependency>
	<groupId>com.github.xiaoymin</groupId>
	<artifactId>knife4j-spring-boot-starter</artifactId>
	<version>3.0.3</version>
</dependency>
  • 引入美化bootstrap-UI
<!-- 引入swagger-bootstrap-ui包 -->
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>swagger-bootstrap-ui</artifactId>
    <version>1.8.5</version>
</dependency>

四、Swagger注解详解

  1. 使用 swagger3 注解代替 swagger2对应表

在这里插入图片描述

  1. swagger3注解详解
  • @Api

@Api 注解用于标注一个Controller(Class)在默认情况下,Swagger-Core只会扫描解析具有@Api注解的类,而会自动忽略其他类别资源(JAX-RS endpoints,Servlets等等)的注解

属性名称备注
valueurl的路径值
tags如果设置这个值、value的值会被覆盖
description对api资源的描述
basePath基本路径可以不配置
position如果配置多个Api 想改变显示的顺序位置
producesFor example, “application/json, application/xml”
consumesFor example, “application/json,application/xml”
protocolsPossible values: http, https, ws, wss.
authorizations高级特性认证时配置
hidden配置为true 将在文档中隐藏

实例:

@Controller
@RequestMapping(value = "/api/pet", produces = {APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE})
@Api(value = "/pet", description = "Operations about pets")
public class PetController {}
  • @ApiOperation

@ApiOperation 注解在用于对一个操作或HTTP方法进行描述。具有相同路径的不同操作会被归组为同一个操作对象。不同的HTTP请求方法及路径组合构成一个唯一操作。

属性描述
valueurl的路径值
tags如果设置这个值、value的值会被覆盖
description对api资源的描述
basePath基本路径可以不配置
position如果配置多个Api 想改变显示的顺序位置
producesFor example, “application/json, application/xml”
consumesFor example, “application/json, application/xml”
protocolsPossible values: http, https, ws, wss.
authorizations高级特性认证时配置
hidden配置为true 将在文档中隐藏
response返回的对象
responseContainer这些对象是有效的 “List”, “Set” or “Map”.,其他无效
httpMethod“GET”, “HEAD”, “POST”, “PUT”, “DELETE”, “OPTIONS” and “PATCH”
codehttp的状态码 默认 200
extensions扩展属性
@RequestMapping(value = "/order/{orderId}", method = GET)
  @ApiOperation(
      value = "Find purchase order by ID",
      notes = "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions",
      response = Order.class,
      tags = { "Pet Store" })
   public ResponseEntity<Order> getOrderById(@PathVariable("orderId") String orderId)
      throws NotFoundException {
    Order order = storeData.get(Long.valueOf(orderId));
    if (null != order) {
      return ok(order);
    } else {
      throw new NotFoundException(404, "Order not found");
    }
  }
  • @ApiParam

@ApiParam作用于请求方法的参数上,定义api参数的注解。

属性描述
name属性名称
value属性值
defaultValue默认属性值
allowableValues可以不配置
required是否属性必填
access不过多描述
allowMultiple默认为false
hidden隐藏该属性
example举例子
public ResponseEntity<Order> getOrderById(
      @ApiParam(value = "ID of pet that needs to be fetched", allowableValues = "range[1,5]", required = true)
      @PathVariable("orderId") String orderId)
public DataResult<ZonesEiaPlanPageInfoVO> detail(@RequestParam("id") @ApiParam(value = "主键", required = true) String id) {}
  • @ApiImplicitParams、@ApiImplicitParam

@ApiImplicitParams、@ApiImplicitParam也可以定义参数.

  • @ApiImplicitParams:用在请求的方法上,包含一组参数说明
  • @ApiImplicitParam:对单个参数的说明
属性描述
name参数名
value参数的说明、描述
required参数是否必须必填
paramType参数放在哪个地方 query --> 请求参数的获取:@RequestParam header --> 请求参数的获取:@RequestHeader path(用于restful接口)–> 请求参数的获取:@PathVariable body(请求体)–> @RequestBody User user form(普通表单提交)
dataType参数类型,默认String,其它值dataType=“Integer”
defaultValue参数的默认值
@ApiImplicitParams({
		@ApiImplicitParam(name="mobile",value="手机号",required=true,paramType="form"),
		@ApiImplicitParam(name="password",value="密码",required=true,paramType="form"),
		@ApiImplicitParam(name="age",value="年龄",required=true,paramType="form",dataType="Integer")
	})
	@PostMapping("/login")
	public JsonResult login(@RequestParam String mobile, @RequestParam String password,
	@RequestParam Integer age){
		//...
	    return JsonResult.ok(map);
	}
  • @ApiResponses、@ApiResponse

@ApiResponses、@ApiResponse进行方法返回对象的说明
主要属性:

属性描述
code数字,例如400
message信息,例如"请求参数没填好"
response返回的类
@ApiResponses({
		@ApiResponse(code = 200, message = "请求成功",response = RestMessage .class),
		@ApiResponse(code = 400, message = "请求参数没填好",response = RestMessage .class),
		@ApiResponse(code = 404, message = "请求路径没有或页面跳转路径不对",response = RestMessage .class)
	}) 
	@ResponseBody
	@RequestMapping("/list")
	public JsonResult list(@RequestParam String userId) {
		...
		return JsonResult.ok().put("page", pageUtil);
	}
  • @ApiModel、@ApiModelProperty
  • @ApiModel用于描述一个Model的信息(这种一般用在post创建的时候,使用@RequestBody这样的场景,请求参数无法使用@ApiImplicitParam注解进行描述的时候)
  • @ApiModelProperty用来描述一个Model的属性
@ApiModel属性描述
value默认 为模型提供一个替代名称
description描述
referencey指定对相应类型定义的引用,覆盖指定的任何其他元数据
@ApiModelProperty属性描述
value默认 字段说明
name重写属性名字
dataType重写属性类型
required是否必填
example举例说明
hidden配置为true将在文档中隐藏
@ApiModel(description= "返回响应数据")
@Data
public class RestMessage implements Serializable{

	@ApiModelProperty(value = "是否成功",required=true)
	private boolean success=true;	
	
	@ApiModelProperty(value = "错误码")
	private Integer errCode;
	
	@ApiModelProperty(value = "提示信息")
	private String message;
	
    @ApiModelProperty(value = "数据")
	private Object data;
}
  • 注: @ApiImplicitParam 跟 @ApiParam 两个注解的区别

@ApiParam和@ApiImplicitParam的功能是相同的,但是@ApiImplicitParam的适用范围更广。在非JAX-RS的场合(比如使用servlet提供HTTP接口),只能使用@ApiImplicitParam进行参数说明。我认为,这是因为接口并不显式展示入参的名称,所以没有地方去使用@ApiParam,只能在接口的方法声明上方写@ApiImplicitParam

参考文章

五、详细例子

配置文件加上@EnableOpenApi、@Configuration 会自动开启配置,启动类不需要加任何注解

@EnableOpenApi//该注解是Springfox-swagger框架提供的使用Swagger注解,该注解必须加
@EnableKnife4j//该注解是knife4j提供的增强注解,Ui提供了例如动态参数、参数过滤、接口排序等增强功能,如果你想使用这些增强功能就必须加该注解,否则可以不用加
@Configuration
public class SwaggerConfig {
/**
 * 接口构建器
 *
 * @return
 */
@Bean
public Docket docket() {
    return new Docket(DocumentationType.OAS_30).apiInfo(apiInfo())
            //用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
            .apiInfo(apiInfo())
            //设置哪些接口暴露给Swagger展示
            .select()
             // (第一种方式)扫描所有有注解的api,用这种方式更灵活
            .apis( RequestHandlerSelectors.withMethodAnnotation( ApiOperation.class ) )

            // (第二种方式)扫描指定包中的swagger注解
            .apis(RequestHandlerSelectors.basePackage("com.swagger_knife4j.swagger4j.controller"))//构建API

            // (第三种方式)扫描所有
            .apis(RequestHandlerSelectors.any())
            .paths( PathSelectors.any() )

            .paths(PathSelectors.any())
            .build()
            .groupName("XimenesChen")
            .enable(true);
  }

   /**
     * 添加摘要信息
     * 创建该API的基本信息(这些基本信息会展现在文档页面中)
     * 访问地址:http://项目实际地址/swagger-ui.html
     */
   private ApiInfo apiInfo() {
            return new ApiInfoBuilder()
                    .title("整合knife-4j,swaggerui基本注解")//标题
                    .description("整合knife-4j,swaggerui基本注解-描述")//描述
                    .contact(new Contact("cxm", "https://mp.csdn.net/mp_blog/manage/article?spm=1001.2014.3001.5114", "cristianoxm@qq.com"))
                    .version("V2.05")
                    .build();
   }
}
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
@ApiModel("common-result")
public class Result<T> {
    @ApiModelProperty(value = "返回状态码")
    private Integer code;
    @ApiModelProperty(value = "返回信息")
    private String message;
    @ApiModelProperty(value = "返回实体信息")
    private T data;
}
@EnableOpenApi//该注解是Springfox-swagger框架提供的使用Swagger注解,该注解必须加
@EnableKnife4j//该注解是knife4j提供的增强注解,Ui提供了例如动态参数、参数过滤、接口排序等增强功能,如果你想使用这些增强功能就必须加该注解,否则可以不用加
@Configuration
public class SwaggerConfig {
/**
 * 接口构建器
 *
 * @return
 */
@Bean
public Docket docket() {
    return new Docket(DocumentationType.OAS_30).apiInfo(apiInfo())
            //用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
            .apiInfo(apiInfo())
            //设置哪些接口暴露给Swagger展示
            .select()
             // (第一种方式)扫描所有有注解的api,用这种方式更灵活
            .apis( RequestHandlerSelectors.withMethodAnnotation( ApiOperation.class ) )

            // (第二种方式)扫描指定包中的swagger注解
            .apis(RequestHandlerSelectors.basePackage("com.swagger_knife4j.swagger4j.controller"))//构建API

            // (第三种方式)扫描所有
            .apis(RequestHandlerSelectors.any())
            .paths( PathSelectors.any() )

            .paths(PathSelectors.any())
            .build()
            .groupName("XimenesChen")
            .enable(true);
  }

   /**
     * 添加摘要信息
     * 创建该API的基本信息(这些基本信息会展现在文档页面中)
     * 访问地址:http://项目实际地址/swagger-ui.html
     */
   private ApiInfo apiInfo() {
            return new ApiInfoBuilder()
                    .title("整合knife-4j,swaggerui基本注解")//标题
                    .description("整合knife-4j,swaggerui基本注解-描述")//描述
                    .contact(new Contact("cxm", "https://mp.csdn.net/mp_blog/manage/article?spm=1001.2014.3001.5114", "cristianoxm@qq.com"))
                    .version("V2.05")
                    .build();
   }
}
@Api(tags = "技术学习规划表-控制器")//@Api:用在类上,说明该类的作用
@RestController
@RequestMapping("/skillStudyPlan")
public class SkillStudyPlanController {
    @ApiOperation("插入技术学习规划")//@ApiOperation:注解来给API增加方法说明
    @PostMapping("insertPlan")
    @ApiResponses({
		@ApiResponse(code = 200, message = "请求成功",response = Result.class),
		@ApiResponse(code = 400, message = "404错误",response = Result.class),
		@ApiResponse(code = 404, message = "路径不存在",response = Result.class)
	})
    public Result<ResponseB> insertPlan(@ApiParam @RequestBody(required = false) SkillStudyPlanDTO skillStudyPlanDTO) {
        ResponseB build = ResponseB.builder().message("ss").code(200).data("data").build();
        System.out.println(skillStudyPlanDTO);
        return new Result<>(200,"ok",build);
    }

    @ApiOperation("查询所有技术学习规划")
    @GetMapping("selectAll")
    public String selectAll(@RequestParam String name,@RequestParam(required = false) Integer age) {
        System.out.print(name);
        System.out.print(age);
        return "success";
    }

    @PostMapping("pageHelp")
    @ApiOperation(value = "分页获取标签列表")
    @ApiImplicitParams({
            @ApiImplicitParam(name="pageNo",value="请求页数",required = false,dataType="Integer",paramType="query"
            ),
            @ApiImplicitParam(name="pageSize",value="请求页大小",required = false,dataType="Integer",paramType="query"),
    })
    //header:请求头
    //query:?param=value的形式
    //path:路径,Restful风格接口
    //body:请求体
    //form:以form表单的形式提交
   @ApiResponses({
		@ApiResponse(code = 200, message = "请求成功",response = Result.class),
		@ApiResponse(code = 400, message = "请求参数没填好",response = Result.class),
		@ApiResponse(code = 404, message = "请求路径没有或页面跳转路径不对",response = Result.class)
	})
    public Result<ResponseA> pageHelp(@RequestParam Integer pageNo, @RequestParam Integer pageSize){
        ResponseA build = ResponseA.builder().message("ss").code(200).data("data").build();
        return new Result<>(200,"ok",build);
    }
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ApiModel("SkillStudyPlanDTO实体类")
public class SkillStudyPlanDTO {

    @ApiModelProperty("SkillStudyPlanDTO.name属性")
    private String name;
    @ApiModelProperty("SkillStudyPlanDTO.age属性")
    private Integer age;
}

代码链接

参考文章
参考文章
参考文章

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

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

相关文章

非零基础自学Golang 第7章 函数 7.8 知识拓展

非零基础自学Golang 文章目录非零基础自学Golang第7章 函数7.8 知识拓展7.8.1 函数参数传递的本质7.8.2 Go内置函数第7章 函数 7.8 知识拓展 7.8.1 函数参数传递的本质 在讲述参数传递前&#xff0c;我们首先要了解两个基本概念&#xff1a;值传递和引用传递。 值传递&…

API接口DTO测试数据构造的一个方式

自动化测试中&#xff0c;经常需要构造请求参数&#xff0c;例如JSON格式的参数&#xff0c;简单的好说&#xff0c;可以手工修改或是用 Postman、Jmeter 等工具结合简单的代码进行处理&#xff0c; 但当数据传输对象&#xff08;DTO&#xff09;很复杂&#xff0c;部分字段依赖…

同样是项目经理,为啥就干不过他?

早上好&#xff0c;我是老原。 很多人和我抱怨说&#xff0c;做工作太难了&#xff0c;领导针对我&#xff0c;同样都是项目经理&#xff0c;就老是挑我的刺&#xff0c;找我的麻烦。 其实在我看来&#xff0c;工作其实没有那么难&#xff0c;80%的工作问题&#xff0c;都是沟…

C#语言实例源码系列-虚拟键盘

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

guitar pro8吉他谱软件好用吗?2023GTP全新功能解析

我们常见的GTP格式吉他谱就是用这款软件制作出来的曲谱&#xff0c;也只能用这款软件打开查看。看介绍感觉还不错&#xff0c;原生支持Apple的芯片了。这也是一款能陪着我们一起进步&#xff0c;提升自己的软件。我们在练习吉他等乐器的过程中&#xff0c;音阶与和弦的熟练掌握…

ffmpeg-AVBuffer、AVBufferRef、引用计数机制

目录 引用计数 定义 优点 AVBuffer AVBufferRef av_buffer_create av_buffer_ref av_buffer_unref 参考&#xff1a; 引用计数 定义 引用计数是一种内存管理的方式&#xff0c;当一份内存可能被多个对象使用&#xff0c;可以通过引用计数的方式实现内存复用。 优点 …

深入理解Maven的各项配置

深入理解Maven的各项配置1. Introduction1.1 Big Data -- Postgres2. Install2.1 Maven Install2.2 Config Setting.xml2.3 Local Package Install Maven3. Project4.AwakeningMaven Document: https://maven.apache.org/. Maven Download: https://maven.apache.org/download.…

基于微信小程序的好物分享系统ssm框架-计算机毕业设计

项目介绍 我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;好物分享系统小程序被用户普遍使用&#xff0c;为方便用户…

【技术应用】mybatis数据库操作(insert、update、delete)返回值为0的场景

【技术应用】mybatis数据库操作insert、update、delete返回值为0的场景一、前言二、数据库异常处理三、insert操作返回值为: 0四、update操作返回值为: 0五、delete操作返回值为: 0六、总结一、前言 最近在review项目组成员代码时&#xff0c;发现代码中有很多mybatis执行数据…

涉及准考证相关需要关注的一系列问题,涉及防疫、考点信息、计算器等内容

12月14日起可以打印准考证&#xff01;这是一件操作并不复杂的工作&#xff0c;但打印下来以后可能会遇到一些细节问题&#xff0c;对此我们梳理出来供大家参考&#xff0c;有则改之&#xff0c;无则更好&#xff01; 1.有关省份个人健康申报表等如何填写&#xff1f;如您报考点…

web网页设计期末课程大作业:美食餐饮文化主题网站设计——美食汇5页HTML+CSS+JavaScript

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

事业编招聘:南方科技大学附属实验学校2022年·面向应届毕业生招聘在编教师公告

南方科技大学是在中国高等教育改革发展背景下创建的一所高起点公办创新型大学&#xff0c;2022年2月14日&#xff0c;教育部等三部委公布第二轮“双一流”建设高校及建设学科名单&#xff0c;南方科技大学入选“双一流”建设高校名单。 南方科技大学附属实验学校&#xff0c;地…

部署了一个个人博客(好歹服务器不是闲着了)

界面前台界面展示&#xff08;给到浏览用户&#xff09;后台界面展示&#xff08;简单介绍&#xff09;技术说明前台界面展示&#xff08;给到浏览用户&#xff09; 肯定首先将界面展示一下。声明一下这个不是我原创的界面&#xff0c;当然这个是可以改造的。这个在安全上还有…

血氧仪的分类与价格区别

有没有发现最近血氧仪、额温枪、壁挂式测温仪又开始火了&#xff1f;并且市场活跃度越来越高。而作为我们血氧仪方案提供商或者生产企业来说&#xff0c;您是不是和优优一样会时常听到客户发出如下反馈&#xff1a; “我刚问了另外一家&#xff0c;和你这个样子差不多的&#…

VC++2010中使用MSDN library 200X版本

前言 以前一直用VS2005 ,帮助文档调用很方便&#xff0c;现在要使用VS2010版本来写程序&#xff0c;这个帮助文档真是不方…… 自己写了一个F1的按键助手&#xff0c;这下我可 以使用VS2008中的帮助文档了&#xff0c;虽然帮助低一个版本&#xff0c;但是写C程序&#xff0c;…

七个步骤覆盖 API 接口测试

接口测试作为最常用的集成测试方法的一部分&#xff0c;通过直接调用被测试的接口来确定系统在功能性、可靠性、安全性和性能方面是否能达到预期&#xff0c;有些情况是功能测试无法覆盖的&#xff0c;所以接口测试是非常必要的。首先需要对接口测试的基本信息做一些了解&#…

阿里面试题库被“泄露“导致多人进大厂,惨遭多家大厂威胁下架

我有一个玩得特别好的朋友找我帮忙&#xff0c;说他儿子去大厂面试几次没刷下来&#xff0c;要求我帮他儿子出出主意&#xff0c;大概了解他儿子的情况后&#xff0c;我就给他推荐了这本软件测试10万总结&#xff0c;大概过了几个月他就给我发信息了&#xff0c;说他已经靠这份…

(一) Oriented R-CNN

文章目录0.基础介绍1.旋转框的中点偏移表示法2.Oriented R-CNN架构2.1 Oriented RPN2.2 Rotated RoI Alignment参考资料欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; 论文&#xff1a;Oriented R-CNN for Object Detection 代码&#xf…

Erlang - 入门之一日志系统如何打印输出使用lager框架

在合适的地方插入一句代码即可&#xff1a; lager:error("Some Message"), 就这样&#xff0c;谢谢阅读 。。。。。。。 。。。。。。。。。 。。。。。。。。。。。 。。。。。。。。。。。。。。 。。。。。。。。。。。。。。。。。 没有什么比从直接“”…

web前端网页课程设计大作业 html+css+javascript天津旅游(11页) dw静态旅游网页设计实例 企业网站制作

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…