knife4j swagger 使用笔记

embedded/2024/9/21 11:22:46/

1.接口访问的端口跟后台设置的不一致,接口请求无反应 处理办法

在这里插入图片描述

2.响应参数不显示问题

(1)返回的参数里面一定要有响应的参数对象,如下:

在这里插入图片描述

(2)TableDataInfo 定义成泛型类 TableDataInfo

package com.dcqq.common.core.page;import java.io.Serializable;
import java.util.List;/*** 表格分页数据对象** @author ruoyi*/
public class TableDataInfo<T> implements Serializable {private static final long serialVersionUID = 1L;/*** 总记录数*/private long total;/*** 列表数据*/private T rows;/*** 消息状态码*/private int code;/*** 消息内容*/private String msg;/*** 表格数据对象*/public TableDataInfo() {}/*** 分页** @param list  列表数据* @param total 总记录数*/public TableDataInfo(T list, int total) {this.rows = list;this.total = total;}public long getTotal() {return total;}public void setTotal(long total) {this.total = total;}public T getRows() {return rows;}public void setRows(T rows) {this.rows = rows;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}
}

3.枚举类文档展示自动转换

效果:
在这里插入图片描述
注意:目前只实现了post请求,其他未能实现

(1)自定义:SwaggerDisplayEnum

package com.dcqq.common.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface SwaggerDisplayEnum {String value() default "value";String desc() default "desc";
}

(2)自定义拓展处理器 SwaggerEnumBuilderPlugin

package com.dcqq.common.config;import cn.hutool.core.util.ReflectUtil;
import com.dcqq.common.annotation.SwaggerDisplayEnum;
import com.dcqq.common.utils.StringUtils;
import io.swagger.annotations.ApiModelProperty;
import org.springframework.context.annotation.Primary;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;
import springfox.documentation.schema.Annotations;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.schema.ModelPropertyBuilderPlugin;
import springfox.documentation.spi.schema.contexts.ModelPropertyContext;import java.util.Arrays;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;@Component
@Primary
public class SwaggerEnumBuilderPlugin implements ModelPropertyBuilderPlugin {@Overridepublic void apply(ModelPropertyContext context) {Optional<ApiModelProperty> reference = Optional.empty();// 找到 @ApiModelProperty 注解修饰的枚举类if (context.getBeanPropertyDefinition().isPresent()) {reference = Annotations.findPropertyAnnotation(context.getBeanPropertyDefinition().get(), ApiModelProperty.class);}//没有@ApiModelProperty 或 reference 为空 直接返回if (!reference.isPresent() || StringUtils.isEmpty(reference.get().reference())) {return;}// 生成需要拼接的取值含义描述内容String valueDesc = generateValueDesc(reference.get());context.getSpecificationBuilder().description(valueDesc);}private String generateValueDesc(ApiModelProperty property) {String enumFullDesc = null;try {Class<? extends Enum> rawPrimaryType = (Class<? extends Enum>) Class.forName(property.reference());SwaggerDisplayEnum swaggerDisplayEnum = AnnotationUtils.findAnnotation(rawPrimaryType,SwaggerDisplayEnum.class);enumFullDesc = Arrays.stream(rawPrimaryType.getEnumConstants()).filter(Objects::nonNull).map(enumConsts -> {Object fieldValue = ReflectUtil.getFieldValue(enumConsts, swaggerDisplayEnum.value());Object fieldDesc = ReflectUtil.getFieldValue(enumConsts, swaggerDisplayEnum.desc());return fieldValue + "-" + fieldDesc;}).collect(Collectors.joining(";"));} catch (ClassNotFoundException e) {throw new RuntimeException(e);}return property.value()+"(" + enumFullDesc + ")";}@Overridepublic boolean supports(DocumentationType delimiter) {return true;}
}

(3)示例枚举

package com.dcqq.common.enums;import com.dcqq.common.annotation.SwaggerDisplayEnum;
import lombok.Getter;/*** 订单消息*/
@Getter
@SwaggerDisplayEnum(value = "value",desc = "desc")//注意:“value”和“desc”必须和定义的属性保存一致
public enum MsgTypeEnum {XD_CG("下单成功通知","1"),YFH("已发货通知","2"),QS_TX("已签收提醒","3"),QX("取消通知","9");private String desc; //描述private String value; //值MsgTypeEnum(String desc, String value) {this.desc = desc;this.value = value;}
}

(4)示例MsgController

package com.dcqq.app;import com.dcqq.common.core.controller.BaseController;
import com.dcqq.common.core.page.TableDataInfo;
import com.dcqq.common.utils.SecurityUtils;
import com.dcqq.system.domain.TShopOrderMsg;
import com.dcqq.system.service.ITShopOrderMsgService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** 消息管理Controller** @author zd* @date 2024-01-10*/
@RestController
@Api(tags = "消息管理")
@RequestMapping("/test/msg")
public class MsgController extends BaseController {@Autowiredprivate ITMsgService msgService;@PostMapping("/list")@ApiOperation("查询消息管理列表")public TableDataInfo<List<Msg>> list(@RequestBody Msg msg) {startPage();List<Msg> list = msgService.selectMsgList(msg);return getDataTable(list);}
}

(5)实体类

关键代码:reference = “com.common.enums.MsgTypeEnum”

package com.system.domain;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.dcqq.common.annotation.ApiPropertyReference;
import com.dcqq.common.annotation.Excel;
import com.dcqq.common.core.domain.BaseEntity;
import com.dcqq.common.enums.MsgTypeEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.math.BigDecimal;/*** 消息对象 * * @author * @date 2024-04-25*/
@Data
public class TShopOrderMsg{private static final long serialVersionUID = 1L;@TableId(type = IdType.AUTO)/** 主键 */@ApiModelProperty("主键")private Long id;/** 删除标志(0代表存在 2代表删除) */@ApiModelProperty("删除标志(0代表存在 2代表删除)")private String delFlag;/** 消息类型({@link com.common.enums.MsgTypeEnum}) */@Excel(name = "消息类型")@ApiModelProperty(value = "消息类型",reference = "com.common.enums.MsgTypeEnum")private String msgType;
}

(6)maven相关

<dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version><exclusions><exclusion><groupId>io.swagger</groupId><artifactId>swagger-models</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.3</version>
</dependency>
<dependency><groupId>io.swagger</groupId><artifactId>swagger-models</artifactId><version>1.6.14</version>
</dependency>
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.27</version>
</dependency>

参考:
https://blog.csdn.net/l121lpanxun/article/details/125297645
https://blog.gelu.me/2021/Knife4j-Swagger%E8%87%AA%E5%AE%9A%E4%B9%89%E6%9E%9A%E4%B8%BE%E7%B1%BB%E5%9E%8B/
https://cloud.tencent.com/developer/article/2105433


http://www.ppmy.cn/embedded/25882.html

相关文章

前端开发者如何在项目里控制修改组件的样式

1为了让自己快速下班&#xff0c;修改样式应该是占据大部分时间&#xff0c;在很多组件库的项目里&#xff0c;都会提到主题设置。 比如element的scss配置变量&#xff0c;通常有人喜欢直接引入css样式来快速完成任务&#xff0c;然后在全局覆盖这些选择器对应的样式&#xff0…

Nacos和Eureka有什么区别!!!

一致性模型&#xff1a; Eureka&#xff1a;采用的是 AP&#xff08;Availability, Partition Tolerance&#xff09;模型&#xff0c;即在面临网络分区或部分节点故障时优先保证系统的可用性&#xff0c;牺牲一定的数据一致性。Eureka 通过自我保护机制&#xff0c;允许在节点…

【MySQL】A01、性能优化-参数监控分析

1、参数监控 1.1、MySQL command 查看 mysql>SHOW STATUS; &#xff08;服务器状态变量&#xff0c;运行服务器的统计和状态指标&#xff09; mysql> SHOW VARIABLES;&#xff08;服务器系统变量&#xff0c;实际上使用的变量的值&#xff09; mysql> SHOW STATUS …

Microsoft Edge 使用心得与深度探索

Microsoft Edge 是微软推出的一款基于 Chromium 开源项目的网页浏览器&#xff0c;它继承了 Chrome 的许多特性&#xff0c;并添加了一些独特的功能&#xff0c;比如垂直标签页、集锦、沉浸式阅读器等。 Microsoft Edge 使用心得与深度探索 一、Microsoft Edge 简介 Microsof…

容器的通俗讲解

想象一下&#xff0c;你正在厨房准备做一顿美味的大餐。厨房里有各种各样的厨具和食材&#xff0c;但是有时候&#xff0c;为了做一道特别的菜&#xff0c;你需要把一些特定的材料和工具单独放在一起&#xff0c;不让它们和其他菜肴的用品混在一起&#xff0c;这样既能保证这道…

【动态规划】Leetcode 32. 最长有效括号【困难】

最长有效括号 给你一个只包含 ‘(’ 和 ‘)’ 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 示例 2&#xff1a; 输入&#xff1a;s “)()())” 输出&#xff1a;4 解释&#xff1a;最长有效括号子串是 “()()” 解题思路 1…

H3C无线控制器查看AP版本是否自动升级

全部网络--无线配置--AP管理--AP全局配置 如果开启了AP版本升级&#xff0c;那么当升级AC无线控制器的时候 &#xff0c; AP也会同时进行升级 命令行&#xff1a; [H3C]wlan auto-ap enable 自动注册 [H3C]wlan auto-persistent enable 自动固化 [Sysname] …

vue 实现 下拉触底事件

注册滚动事件 window.addEventListener(scroll, this.onScroll, true) 事件触发 onScroll () {let scrollTop document.documentElement.scrollTop || document.body.scrollToplet clientHeight document.documentElement.clientHeightlet scrollHeight document.document…