spring boot 集成 knife4j

1、knife4j介绍以及环境介绍

    knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名knife4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍!其底层是对Springfox的封装,使用方式也和Springfox一致,只是对接口文档UI进行了优化。

     jdk为1.8 ,springboot 2.7.3、knife4j的版本3.0.3。

2、pom依赖

<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>

3、代码样例

1、开启swagger以及knife4j配置代码

package com.example.demo.config;import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;@Configuration
@EnableSwagger2//该注解是Springfox-swagger框架提供的使用Swagger注解,该注解必须加
@EnableKnife4j//该注解是knife4j提供的增强注解,Ui提供了例如动态参数、参数过滤、接口排序等增强功能,
//如果你想使用这些增强功能就必须加该注解,否则可以不用加
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfiguration {@Bean(value = "defaultApi2")public Docket defaultApi2() {Docket docket = new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())//分组名称.groupName("1.X版本").select()//这里指定Controller扫描包路径.apis(RequestHandlerSelectors.basePackage("com.example.demo.controller")).paths(PathSelectors.any()).build();return docket;}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("项目标题").description("描述").termsOfServiceUrl("服务Url").contact(new Contact("DAIHAO", "", "")).version("1.0").build();}}

2、请求参数代码,需要使用ApiModel和ApiModelProperty 注解

package com.example.demo.model;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import javax.validation.constraints.NotNull;@Data
@ApiModel(value = "订单分页查询对象")
public class OrderQuery {@ApiModelProperty(value = "订单查询开始时间")private String startTime;@ApiModelProperty(value = "订单查询结束时间")private String endTime;@NotNull(message = "分页不能为空")@ApiModelProperty(value = "每页显示的数量", required = true, example = "15")private Integer pageSize;@NotNull(message = "当前页不能为空")@ApiModelProperty(value = "当前页", required = true, example = "1")private Integer pageNo;@ApiModelProperty(value = "订单编号")private String id;@ApiModelProperty(value = "订单原始编号")private Long oid;
}

返回参数代码,也是要ApiModel和ApiModelProperty 注解

全局返回实体

package com.example.demo.po;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.io.Serializable;package com.example.demo.po;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.io.Serializable;/*** @date 2023年03月27日 14:02*/
@Data
@ApiModel("返回体")
public class ResultVO<T> implements Serializable {@ApiModelProperty(value = "返回状态码,0:表示成功,1表示失败")private String code ;@ApiModelProperty(value = "返回描述")private String message ;@ApiModelProperty(value = "数据体")private T data ;public ResultVO(String code, String message, T data) {this.code = code;this.message = message;this.data = data;}public static ResultVO  success(Object data){return  new ResultVO("0","成功",data);}public ResultVO  fail( ){return  new ResultVO("1","失败",null);}
}@Data
@ApiModel("返回体")
public class ResultVO<T> implements Serializable {@ApiModelProperty(value = "返回状态码,0:表示成功,1表示失败")private String code ;@ApiModelProperty(value = "返回描述")private String message ;@ApiModelProperty(value = "数据体")private T data ;public ResultVO(String code, String message, T data) {this.code = code;this.message = message;this.data = data;}public static ResultVO  success(Object data){return  new ResultVO("0","成功",data);}public ResultVO  fail( ){return  new ResultVO("1","失败",null);}
}

泛型体返回举例

package com.example.demo.model;import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import javax.validation.Valid;
import java.util.Date;
import java.util.List;/*** @date 2023年05月05日 13:31*/
@Data
@ApiModel("订单实体")
public class Order {@Valid@ApiModelProperty(value = "订单编号")private String id;@ApiModelProperty(value = "订单原始编号")private Long oid ;@ApiModelProperty("订单名称")private  String name1  ;@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")private Date date1 ;@ApiModelProperty(value = "子订单列表")private List<OrderItem> orderItemList;
}

控制器代码示例,需要使用Api、ApiOperation注解

package com.example.demo.controller;import com.example.demo.model.Order;
import com.example.demo.model.OrderItem;
import com.example.demo.model.OrderQuery;
import com.example.demo.po.ResultVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;import java.util.ArrayList;
import java.util.List;@RestController
@RequestMapping("/order")
@Api(tags = "订单管理")
public class OrderContronller {@ApiOperation("订单列表接口")@PostMapping("getOrderList")@ResponseBodypublic ResultVO<Order>  getOrderList(@RequestBody OrderQuery  orderQuery){Order  order  = new Order();order.setId("123423");order.setOid(123444L);OrderItem  orderItem = new OrderItem();orderItem.setOrderItemId("133");orderItem.setPrice(1000l);orderItem.setName("手机");List<OrderItem> orderItemList = new ArrayList<>();orderItemList.add(orderItem);order.setOrderItemList(orderItemList);return ResultVO.success(order);}}

4、展示结果

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

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

相关文章

案例解读 | 香港某多元化综合金融企业基础监控+网管平台建设实践

PART01 项目背景 01客户简介案例客户是一家创立20多年的香港某多元化综合金融企业&#xff0c;其业务范围涵盖证券、期货、资产管理、财富管理等&#xff0c;凭借广泛的业务网络和多元化的金融服务产品&#xff0c;在市场中拥有显著的影响力。02痛点分析随着业务版图的持续拓展…

KCP解读:C#库类图

本文是系列文章中的一篇&#xff0c;内容由浅到深进行剖析&#xff0c;为了方便理解建议按顺序一一阅读。 KCP技术原理 KCP解读&#xff1a;基础消息收发 KCP解读&#xff1a;重传机制 KCP解读&#xff1a;滑动窗口 KCP解读&#xff1a;拥塞控制 本系列的源码基于https://gith…

Nginx:Stream模块

什么是 Stream 模块? Stream 模块 是 Nginx 的一个核心模块,专为处理非 HTTP 协议的流量(TCP 和 UDP 流量)而设计。它可以用来负载均衡和代理 TCP 或 UDP 连接,适用于多种应用场景,如: 数据库集群(MySQL、PostgreSQL 等)邮件服务器(SMTP、IMAP、POP3)游戏服务器VoI…

Profinet转EtherNet/IP网关连接AB PLC的应用案例

某大型制造企业的生产车间同时采用了西门子 S7 - 1500 PLC 作为核心控制系统的一部分&#xff0c;负责主要生产流程的控制与数据处理&#xff1b;而在特定生产环节&#xff0c;由于历史设备遗留或工艺配套需求&#xff0c;存在使用 AB PLC 的情况。这就导致了在整个自动化生产系…

arcgisPro加载CGCS2000天地图后,如何转成米单位

1、导入加载的天地图影像服务&#xff0c;一开始是经纬度显示的。 2、右键地图&#xff0c;选择需要调整的投影坐标&#xff0c;这里选择坐标如下&#xff1a; 3、点击确定后&#xff0c;就可以调整成米单位的了。 4、切换后结果如下&#xff1a; 如有需要&#xff0c;可调整成…

2025新春烟花代码(二)HTML5实现孔明灯和烟花效果

效果展示 源代码 <!DOCTYPE html> <html lang"en"> <script>var _hmt _hmt || [];(function () {var hm document.createElement("script");hm.src "https://hm.baidu.com/hm.js?45f95f1bfde85c7777c3d1157e8c2d34";var …

机器人技术:ModbusTCP转CCLINKIE网关应用

在当今自动化生产与智能制造领域&#xff0c;ModbusTCP转CC-LinkIE网关KJ-MTCPZ-CCIES的应用正日益成为提升生产效率、实现设备间高效通信的重要技术手段。这一转换技术不仅打破了不同通信协议间的壁垒&#xff0c;还为机器人产品的应用提供了更为广阔的舞台。ModbusTCP作为一种…

Openwrt @ rk3568平台 固件编译实践(二)- ledeWRT版本

目录 ledeWRT介绍固件编译下载代码修改feed源更新并安装编译第三方软件包制作用于eMMC烧写的rootfs基于lede发行版验证烧写rk3568.img, LEDE wrt启动成功refhttps://blog.csdn.net/zc21463071/article/details/106751361介绍rk3568平台下, lede 大神版 openwrt固件的下载、编译…

【linux系统之redis6】redisTemplate的使用方法

新版本的application.yml配置文件 spring:data:redis:host: 192.168.1.102port: 6379lettuce:pool:max-active: 8min-idle: 1max-idle: 0max-wait: 100redisTemplate使用方法 <dependencies><dependency><groupId>org.springframework.boot</groupId>…

【算法】字符串算法技巧系列

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 引入&#xff1a;字符串相关算法技巧 1&#xff1a;字符串转数组 2&#xff1a;子字符串 3&#xff…

掌握正则表达式:从入门到精通的实战指南

文章目录 &#x1f30d;一.正则表达式❄️1.为什么学习正则表达式❄️ 2.基本介绍❄️3.分析底层实现 &#x1f30d;二.正则表达式的语法❄️1.字符匹配❄️2.量词❄️3.定位符4.分组和引用❄️6.非贪婪匹配❄️7.分支结构❄️实际应用 &#x1f30d; 三.正则标表达式的三个常用…

leetcode 5. 最长回文子串

题目如下 本题可以这么来想设有一个回文串s"112211"当我们去掉左右两边的"1"时s任然是回文串。 反过来说现有字符串 "x1221y"(x,y都是未知字符)当且仅当x y时这个字符串是回文串。 故我们可以令i j为某一个字符串的左右两端然后有如下情况: i…

BoltzGnu Boltztrap数据绘图脚本

BoltzGnu包含四个Gnuplot脚本&#xff0c;允许绘制BoltzTraP输出数据。 下载网址&#xff1a; https://github.com/K4ys4r/BoltzGnu 1. pTRACE_E.gp -> To plot Trasport proporties as a function of energy at define Temperature2. pTRACE_E_multT.gp -> To pl…

AIA - APLIC之三(附APLIC处理流程图)

本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 APLIC复位 APLIC复位后,其所有状态都变得有效且一致,但以下情况除外: 每个中断域的domaincfg寄存器(spec第 4.5.1 节);可能是machine-level interrupt domain的MSI地址配置寄存器(spec第4.5.3 和4.5…

【MySQL】深度学习数据库开发技术:使用CC++语言访问数据库

**前言&#xff1a;**本节内容介绍使用C/C访问数据库&#xff0c; 包括对数据库的增删查改操作。 主要是学习一些接口的调用&#xff0c; 废话不多说&#xff0c; 开始我们的学习吧&#xff01; ps:本节内容比较容易&#xff0c; 友友们放心观看哦&#xff01; 目录 准备mysql…

微信小程序map组件所有markers展示在视野范围内

注意&#xff1a;使用include-points属性不生效&#xff0c;要通过createMapContext实现 <template><view class"map-box"><map id"map" class"map" :markers"markers" :enable-traffic"true" :enable-poi&…

全新免押租赁系统打造便捷安全的租赁体验

内容概要 全新免押租赁系统的推出&#xff0c;标志着租赁行业的一次重大变革。这个系统的最大特点就是“免押金”&#xff0c;大大减轻了用户在租赁过程中的经济负担。从此&#xff0c;不再需要为一部手机或其他商品支付高昂的押金&#xff0c;用户只需通过简单的信用评估&…

【C++】B2106 矩阵转置

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目解析&#x1f4af;第一种实现方式&#xff1a;我的初始做法实现思路优缺点分析 &#x1f4af;第二种实现方式&#xff1a;我的优化做法实现思路优缺点分析 &#x1f4a…

xxl-job回调执行器,发生NPE空指针异常

一、背景 xxl-job管理后台报错&#xff1a; 22:33:26.615 logback [http-nio-8090-exec-9] ERROR c.x.j.a.c.r.WebExceptionResolver - WebExceptionResolver:{} java.lang.NullPointerException: nullat com.xxl.job.admin.service.impl.AdminBizImpl.callback(AdminBizImpl…

UE 5.3 C++ 管理POI 如何对WidgetComponent 屏幕模式进行点击

一.首先对很多对 World 模式下的点击&#xff0c;选择接受 硬件输入&#xff0c;就可以实现点击。 二。Screen 模式下&#xff0c;的POI。如果想要点击&#xff0c; 设置好 Layers。 在Widget下&#xff0c;加个Button。 即使上面有其他&#xff0c;但也能点击到。 。 如果相…