knife4j swagger 使用笔记

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 {
    @Override
    public 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 + ")";
    }

    @Override
    public 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 {

    @Autowired
    private 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

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

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

相关文章

移动应用安全

移动应用安全 移动应用安全主要关注Android、iOS、Windows Phone等平台上移动应用软件安全状态。它涉及应用程序在其设计运行的平台上下文中的安全问题、它们使用的框架以及预期的用户集。所有主流的移动平台都提供大量可选的安全控制&#xff0c;旨在帮助软件开发人员构建安全…

浅析扩散模型与图像生成【应用篇】(十八)——ControlNet

18. Adding Conditional Control to Text-to-Image Diffusion Models 现有的文生图模型如Stable Diffusion通常需要人工输入非常准确的提示词&#xff0c;而且生成的结果还是完全随机不可控制的&#xff0c;只能通过生成多个结果&#xff0c;再从中选取最佳方案。而ControlNet的…

竞争分析:波特五力模型

波特五力模型是分析企业竞争环境的一个分析模型。 根据波特的观点&#xff0c;每家企业都受到“直接竞争对手、顾客、供应商、潜在新进公司和替代性产品”这五个“竞争作用力”的影响。 我们用波特五力模型试着分析下实体书店竞争是否激励。 直接竞争对手&#xff1a;如果直接…

料堆体积测量新方案:激光雷达

激光雷达测量料堆体积是一种高效且精确的方法。激光雷达的工作原理与雷达相似&#xff0c;通过发射激光束探测目标的位置、速度等特征量。在测量料堆体积时&#xff0c;激光雷达系统向料堆发射激光束&#xff0c;然后接收从料堆表面反射回来的信号。通过对这些反射信号的处理和…

Linux网络之DNS域名解析

一、DNS概述 1.1什么是DNS 域名解析协议&#xff0c;将域名转换成IP地址 1.2为什么要用DNS IP地址不便于记忆&#xff0c;DNS使用户可以通过易记的域名快速访问各种网络资源。 192.168.0.0—— ip地址过长而且都是数字&#xff0c;不方便记忆就出现了域名 www.baidu.com—…

记一次线上日志堆栈不打印问题排查(附:高并发系统日志打印方案可收藏)

目录 一.线上的日志堆栈不打印了二.一步一步仔细排查三.最后搞定四.聊一聊线上日志到底应该怎么打印4.1 日志打印的诉求4.2 常见的系统日志上报方案4.2.1 ELK 方案4.2.2 自定义log appender 完成应用日志采集. 4.3 日志常见框架傻傻分不清4.4 日志在高并发系统中需要注意的 tip…

神仙级Python入门教程,手把手教你从0到精通,学不会算我输!

亲爱的朋友们&#xff0c;你是否对编程充满好奇&#xff0c;却觉得它遥不可及&#xff1f; 你是否想学习一门强大的编程语言&#xff0c;却不知从何下手&#xff1f; 那么&#xff0c;这篇“神仙级”Python入门教程就是为你量身打造的&#xff01;不论你是编程小白还是有一定…

linux笔记4--shell命令1

文章目录 一. 目录1.说明2.盘符3.linux根目录(以Ubuntu为例)①说明②根目录下一些文件夹的解析/home/root/mnt/media/var/cdrom/etc/lib (/lib32--32位的&#xff0c;/lib64-64位的)/lostfound/boot/proc/bin/sbin/snap/srv/usr/opt/dev/run/tmp 二. ls命令--操作文件夹1.说明2…

探索阿里巴巴商品详情API接口:开启电商数据之旅

阿里巴巴商品详情API接口是阿里巴巴开放平台提供的一项服务&#xff0c;它允许开发者通过调用接口获取指定商品的详细信息&#xff0c;包括商品标题、价格、库存、描述、图片等。这些数据对于电商从业者来说具有极高的价值&#xff0c;可以帮助他们更好地了解市场动态&#xff…

层次分析法(AHP)计算原理解释

AHP层次分析法是一种解决多目标复杂问题的定性和定量相结合进行计算决策权重的研究方法。该方法将定量分析与定性分析结合起来&#xff0c;用决策者的经验判断各衡量目标之间能否实现的标准之间的相对重要程度&#xff0c;并合理地给出每个决策方案的每个标准的权数&#xff0c…

vue下载文件时显示进度条

1.单个下载&#xff08;开始是导出按钮 下载显示进度条&#xff09; html <el-button click.stop"exportReport(scope.row, scope.index)" v-if"!scope.row.schedule" icon"el-icon-download"size"small" type"text"styl…

Linux第十五章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

系统思考—企业辅导咨询

从2004年、2014年到2024年&#xff0c;国九条政策的发布与变迁不仅影响了行业趋势&#xff0c;更深刻地改变了企业的风险预估和策略辅导。彼得杜鲁克曾经说过&#xff1a;“必须系统地抛弃旧知识。”这不仅是企业领导者的挑战&#xff0c;也是我们每个人的难题。难点不在于我们…

GITEE 基于OAuth2的API V5版本

为了构建更好的码云生态环境&#xff0c;我们推出了基于OAuth2的API V5版本。 API V5接口使用方式以及Url都参照GitHub&#xff0c;为了各位开发者更好的兼容已经存在的第三方应用。 API 使用条款 OSCHINA 用户是资源的拥有者&#xff0c;需尊重和保护用户的权益。不能在应用…

Spring AI 抢先体验,5 分钟玩转 Java AI 应用开发

作者&#xff1a;刘军 Spring AI 是 Spring 官方社区项目&#xff0c;旨在简化 Java AI 应用程序开发&#xff0c;让 Java 开发者像使用 Spring 开发普通应用一样开发 AI 应用。 Spring Cloud Alibaba AI 以 Spring AI 为基础&#xff0c;并在此基础上提供阿里云通义系列大模…

XY_RE复现(二)

一&#xff0c;何须相思煮余年 0x55 0x8b 0xec 0x81 0xec 0xa8 0x0 0x0 0x0 0xa1 0x0 0x40 0x41 0x0 0x33 0xc5 0x89 0x45 0xfc 0x68 0x9c 0x0 0x0 0x0 0x6a 0x0 0x8d 0x85 0x60 0xff 0xff 0xff 0x50 0xe8 0x7a 0xc 0x0 0x0 0x83 0xc4…

编译Qt6.5.3LTS版本(Mac/Windows)的mysql驱动(附带编译后的全部文件)

文章目录 0 背景1 编译过程2 福利参考 0 背景 因为项目要用到对MYSQL数据库操作&#xff0c;所以需要连接到MYSQL数据库。但是连接需要MYSQL驱动&#xff0c;但是Qt本身不自带MYSQL驱动&#xff0c;需要自行编译。网上有很多qt之前版本的mysql驱动&#xff0c;但是没有找到qt6…

SiO2杂化纳米纤维膜

SiO2杂化纳米纤维膜是一种结合了二氧化硅&#xff08;SiO2&#xff09;纳米颗粒和其他材料&#xff08;如聚合物&#xff09;的复合纳米纤维膜。这种膜材料结合了SiO2的良好性能&#xff08;如高硬度、高耐磨性、热稳定性等&#xff09;和其他材料的特性&#xff08;如柔韧性、…

【XR806开发板试用】基于XR806实现智能小车

一、实验功能&#xff1a; 1、 基于XR806实现WIFI连接路由器 2、 XR806设备创建TCP socket服务器&#xff0c;局域网内通过PC端TCP客服端连接XR806 TCP服务器进行指令控制小车运行&#xff08;指令&#xff21;&#xff1a;前进、&#xff22;&#xff1a;后退、&#xff23;&…

等保测评有那些流程?为什么要做等保

根据《网络安全法》规定&#xff0c;网络运营者应当按照国家的网络安全技术标准和要求&#xff0c;采取技术措施保障网络安全&#xff0c;避免网络安全事件的发生。而等保测评是国家对企事业单位进行信息系统安全等级评定的一项重要制度&#xff0c;通过等级测评&#xff0c;可…