【Spring】yaml自定义参数添加提示功能

文章目录

    • 1. 说明
    • 2. 依赖
    • 3. 处理流程(以自定义swagger配置为例)
      • 3.1 定义自定义参数`SwaggerProperties`
      • 3.2 通过Configuration启用并使用自定义参数
    • 4. 使用

返回首页

1. 说明

编写SpringBoot项目时是不是羡慕spring以及第三方插件的自动提示功能。其实实现很简单,且听我道来。

2. 依赖

对于maven和gradle依赖写法不一样,为了避免依赖,均列在下面

// gradle中引入依赖 
dependencies {
    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
 }
<!-- maven中引入依赖 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
  <optional>true</optional>
</dependency>

3. 处理流程(以自定义swagger配置为例)

3.1 定义自定义参数SwaggerProperties

注意:这里的提示是需要写的,这是后面yaml中自定义参数的提示内容

@Data
@ConfigurationProperties(prefix = "seed.swagger")
public class SwaggerProperties {
    /**
     * 是否启用,默认:启用
     */
    private boolean enable = true;
    /**
     * 名称,默认:seed接口管理
     */
    private String title = "Seed接口管理";
    /**
     * 简介
     */
    private String description;
    /**
     * 作者,默认:叶甯
     */
    private String author = "叶甯";
    /**
     * 版本,默认:1.0.0
     */
    private String version = "1.0.0";
    /**
     * 全局鉴权参数,默认:Authorization
     */
    private String security = "Authorization";

    /**
     * 定义分组
     */
    private List<GroupConfig> groupConfig = new ArrayList<>();

    /**
     * 分组配置
     */
    @Data
    @NoArgsConstructor
    public static class GroupConfig {
        /**
         * 分组名称
         */
        private String group;
        /**
         * 扫描包地址
         */
        private List<String> packagesToScan = new ArrayList<>();

    }
}

3.2 通过Configuration启用并使用自定义参数

@AutoConfiguration
@Slf4j
@EnableConfigurationProperties(SwaggerProperties.class) // 启用SwaggerProperties
public class SwaggerAutoConfiguration implements BeanFactoryAware {
    @Resource
    private SwaggerProperties swaggerProperties;
    private BeanFactory beanFactory;

    @Bean
    public OpenAPI openAPI() {
        log.info("swggger加载中... OpenAPI接口文档信息");
        OpenAPI openApi = new OpenAPI();
        //基础参数信息
        openApi.setInfo(getInfo());
        //指定安全模式参数
        securitySchemes(openApi);
        return openApi;
    }

    //这个是自定义分组和返回鉴权策略的he
    @Bean
    public GroupedOpenApi groupedOpenApi() {
        log.debug("swggger加载中... GroupedOpenApi 接口文档信息");
        ConfigurableBeanFactory configurableBeanFactory = (ConfigurableBeanFactory) beanFactory;
        final OperationCustomizer globalHeader = (operation, handlerMethod) -> {
            operation.addParametersItem(new HeaderParameter()
                    .$ref("#/components/parameters/testheader"));
            return operation;
        };
        if (swaggerProperties != null && !ObjectUtils.isEmpty(swaggerProperties.getGroupConfig())) {
            List<SwaggerProperties.GroupConfig> groupConfigs = swaggerProperties.getGroupConfig();
            for (SwaggerProperties.GroupConfig entity : groupConfigs) {
                GroupedOpenApi api = GroupedOpenApi.builder()
                        .group(entity.getGroup())
                        .packagesToScan(entity.getPackagesToScan().toArray(new String[entity.getPackagesToScan().size()]))
                        .addOperationCustomizer(globalHeader)
                        .addOpenApiCustomizer(getResponseMessages())
                        .build();
                //注册成bean
                configurableBeanFactory.registerSingleton(entity.getGroup(), api);
            }
        }
        return null;
    }

    /**
     * 安全模式,这里指定token通过Authorization头请求头传递
     */
    private void securitySchemes(OpenAPI openApi) {
        if (swaggerProperties != null && !ObjectUtils.isEmpty(swaggerProperties.getSecurity())) {
            SecurityScheme securityScheme = new SecurityScheme()
                    .name(swaggerProperties.getSecurity())
                    .scheme("bearer ")
                    .bearerFormat("JWT")
                    .type(SecurityScheme.Type.HTTP)
                    .in(SecurityScheme.In.HEADER)
                    .description("安全模式-指定参数:" + swaggerProperties.getSecurity());
            openApi.schemaRequirement(swaggerProperties.getSecurity(), securityScheme)
                    .addSecurityItem(new SecurityRequirement().addList(swaggerProperties.getSecurity()));
        }
    }

    private Info getInfo() {
        if (swaggerProperties == null) {
            swaggerProperties = new SwaggerProperties();
        }
        Contact contact = new Contact()
                .name(ObjectUtils.isEmpty(swaggerProperties.getAuthor()) ? "作者" : swaggerProperties.getAuthor());
        Info info = new Info()
                .title(ObjectUtils.isEmpty(swaggerProperties.getTitle()) ? "接口文档" : swaggerProperties.getTitle())
                .version(ObjectUtils.isEmpty(swaggerProperties.getVersion()) ? "版本信息" : swaggerProperties.getVersion())
                .description(ObjectUtils.isEmpty(swaggerProperties.getDescription()) ? "更多请咨询服务开发者。" : swaggerProperties.getDescription())
                .contact(contact);
        return info;
    }

    /**
     * 设置全局响应状态
     *
     * @return
     */
    private OpenApiCustomizer getResponseMessages() {
        return openApi -> {
            openApi.getPaths().values().forEach(pathItem ->
                    pathItem.readOperations().forEach(operation -> {
                        //鉴权指定参数 Security
                        if (swaggerProperties != null && !ObjectUtils.isEmpty(swaggerProperties.getSecurity())) {
                            List<SecurityRequirement> securityList = new ArrayList<>();
                            securityList.add(new SecurityRequirement().addList(swaggerProperties.getSecurity()));
                            operation.security(securityList);
                        }
                    }));
        };
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }
}

4. 使用

注意:为了方便IDE识别对应的META-INF/spring-configuration-metadata.json ,在使用前需要将代码重新构建下,便于IDE生成提示json。
然后就可以愉快的使用了。在这里插入图片描述

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

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

相关文章

【CSP试题回顾】201409-3-字符串匹配

CSP-201409-3-字符串匹配 关键点&#xff1a;<string>库函数的使用 length() 或 size(): 返回字符串的长度。 empty(): 检查字符串是否为空。 append() 或 : 向字符串的末尾添加字符或另一个字符串。 insert()在字符串的指定位置插入另一个字符串或字符。 std::str…

《汇编语言》第3版 (王爽)第10章检测点解析

第10章 检测点 检测点10.1&#xff1a;补全程序&#xff0c;实现从内存1000:0000处开始执行指令。 解析: 我们知道retf指令是用栈中的数据&#xff0c;同时修改CS和IP寄存器中的内容&#xff0c;实现远转移&#xff0c;而且是先出栈的数据放入IP中&#xff0c;后出栈的数据放入…

数据分析-Pandas两种分组箱线图比较

数据分析-Pandas两种分组箱线图比较 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&am…

Yolov7-tiny如何指定某个权重继续断点训练,并且训练到指定轮数

文章目录 前情提要步骤1. 拷贝整个运行train.py之后生成的文件&#xff08;然后删掉weights文件夹&#xff09;2. 删掉新路径下的weights里的所有权重&#xff0c;然后挑选一个权重放进去3. 修改新路径下的opt.yaml4. 指定新路径下的weights重的权重的绝对路径&#xff0c;开始…

Modified Bessel Function of the First Kind

Abstract 最近接触到 von Mises–Fisher distribution, 其概率密度如下: f p ( x ; μ , κ ) κ p 2 − 1 ( 2 π ) p 2 I p 2 − 1 ( κ ) e κ μ ⊺ x \begin{aligned} f_{p}(\bm{x}; \bm{\mu}, \kappa) \frac{\kappa^{\frac{p}{2}-1}} {(2\pi)^{\frac{p}{2}} I_{\frac…

2.5K Star,打造个性化博客平台

2.5K Star&#xff0c;打造个性化博客平台 Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub 指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 导语 在当今的信息时代&a…

Interceptor拦截器+JWT令牌实现登陆验证

一、背景 与过滤器的作用类似&#xff0c;不过拦截器是spring中的组件&#xff0c;只能拦截进入spring的请求&#xff1b;过滤器则可以拦截所有从前端页面发送来的请求。 *拦截器和过滤器选一就可以实现登陆验证&#xff0c;过滤器的实现在以下这篇博客中&#xff0c;有需要可…

设置Matlab2022a断点查看参数变化

Matlab2022a设置断点&#xff0c;查看参数变化 本文使用的是下载好的matlab2022a软件&#xff0c;下载加安装matlab预计1小时&#xff08;百度网盘加速&#xff09;。需要的安装包的评论。 安装好的matlab界面如下&#xff1a; 接下来&#xff0c;编辑一个.m文件&#xff0c;…

【docker基础学习之】镜像构建

下面是在工作过遇到的一些实际例子&#xff0c;谨以此作为笔记参考 目录 1.背景2. 寻找方案3. 如何解决4.解决步骤4.1 DockerFile4.2 现在要做的 5. 镜像相关命令 1.背景 部署&#xff08;迁移&#xff09;项目时发现&#xff0c;项目的excel导出功能报错&#xff0c;错误如下…

灵根孕育源流出,心性修持大道生

解法&#xff1a; 手动本地跑了一下1e9&#xff0c;显然超时。 然后预处理发现开不了这么大的数组。 肯定有规律&#xff0c;打表看看 代码如下 #include<iostream> #include<vector> #include<algorithm> #include<cmath> using namespace std; #…

3.7作业

一 1&#xff09;应用层 负责处理不同应用程序之间的通信&#xff0c;需要满足提供的协议&#xff0c;确保数据发送方和接收方的正确 应用层提供的协议&#xff1a; &#xff08;2&#xff09;表示层 负责网络中通信的数据的编码和格式&#xff0c;确保通信过程中…

喜讯|智安网络与OceanBase完成产品兼容性互认证

近日&#xff0c;深圳市智安网络有限公司旗下产品智安云综合防御平台V3.0与北京奥星贝斯科技有限公司的OceanBase数据库正式完成兼容性互认证。经双方联合测试&#xff0c;结果表明&#xff1a;OceanBase数据库软件V4与智安云综合防御平台V3.0完全兼容&#xff0c;在功能、性能…

用户角色的重要性:确保财务数据安全的最佳方式

在企业的财务管理业务中&#xff0c;一个人几乎不可能完成所有的财务记账任务&#xff0c;例如设定预算、发票审批等等&#xff0c;至少不能有效地执行。最为明智的方式&#xff0c;是将这些任务分派给特定的人员&#xff0c;比如部门经理、财务经理或者销售、市场人员等等。 但…

Sora: 大型视觉模型背景、技术、局限性和机遇的综述

论文链接&#xff1a;https://arxiv.org/pdf/2402.17177.pdf 背景 在分析 Sora 之前&#xff0c;研究者首先盘点了视觉内容生成技术的沿袭。 在深度学习革命之前&#xff0c;传统的图像生成技术依赖于基于手工创建特征的纹理合成和纹理映射等方法。这些方法在生成复杂而生动…

Xilinx 7系列 FPGA硬件知识系列(八)——Xilinx FPGA的复位

目录 概要 Xilinx复位准则 全局复位主要由以下三种方式实现 高时钟频率下的复位时序全局复位对时序的要求真的很关键吗&#xff1f; 独热码状态机的复位 FPGA配置 概要 Xilinx白皮书WP272《Get Smart About Reset: Think Local, Not Global》详细讲述了FPGA的全…

IDEA中新增文件,弹出框提示是否添加到Git点错了,怎么重新设置?

打开一个配置了Git的项目&#xff0c;新增一个文件&#xff0c;会弹出下面这个框。提示是否将新增的文件交给Git管理。 一般来说&#xff0c;会选择ADD&#xff0c;并勾选Dont ask agin&#xff0c;添加并不再询问。如果不小心点错了&#xff0c;可在IDEA中重新设置&#xff08…

蓝桥杯嵌入式模板构建——RCT时钟

在CubeMX里的RTC模块启用RTC时钟和日历功能 输入到RTC的时钟要配置成1HZ,这样的话RTC每经过1s走时一次 由于RTC时钟默认配置为32Khz 所以我们需要将异步分频值与同步分频值的乘积调整为32K分频即可一秒走时一次 频率&#xff1a;32000hz / 32000hz 1hz 必须是31和999&#…

Processing基本形状内容和实例

一、Processing的基本形状内容和实例 1.Processing有一组专门绘制基本图形得图案。像线条这样的基本图形可以被连接起来创建更为复杂得形状&#xff0c;例如一片叶子或者一张脸。 2.为了绘制一条直线&#xff0c;我们需要四个参数&#xff0c;两个用于确定初始位置&#xff0c;…

一文读懂HDMI的演变-从HDMI1.0到HDMI2.1(建议收藏)

HDMI&#xff0c;全称为&#xff08;High Definition Multimedia Interface&#xff09;高清多媒体接口&#xff0c;主要用于传输高清音视频信号。 HDMI System HDMI系统包括HDMI的source和HDMI的sink, 其中source 是源端&#xff0c;即信号的来源&#xff1b;Sink的接收端&a…

Android车载开发之AAOS快速入门

一、概述 在正式介绍Android Automotive OS之前,我们先弄清两个概念:Android Auto和Android Automotive OS。 Android Auto Android Auto 不是操作系统,而是一个应用或一个服务。当 Android 手机通过无线或有线方式连接到汽车时,Android 系统会将使用 Android Auto 服务…