SpringBoot - SWAGGER2公共模块的抽象集成与使用(二)

spring boot环境抽象的实现方法 在实际开发中,开发人员在编写springboot的时候通常要在本地环境测试然后再部署到Production环境,这两种环境一般来讲是不同的,最主要的区别就是数据源的不同。本文主要介绍了这两种,感兴趣的可以了解一下 立即下载

写在前面

前后端分离的项目中,使用 Swagger2 来构建在线接口文档是必不可少的,如果所有的微服务都配置SWAGGER2的信息太麻烦了,所以接下来一步一步的带着大家构建统一的SWAGGER组件。

在阅读该博文前需要先了解以下内容:
JAVA8 - java.util.function.Predicate
SpringBoot - spring.factories的作用是什么?
SpringBoot - Swagger2的集成与使用(一)

如何创建

1. 创建一个单独的模块(servicex-common-swagger)
2. 在该模块中引入依赖
<!-- SpringBoot Web -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- Swagger -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
</dependency>

<!-- Swagger UI -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
</dependency>

<!-- lombok 工具 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
3. 自定义SWAGGER2注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({SwaggerAutoConfiguration.class})
public @interface EnableServiceSwagger2 {
}
4. 创建自动装配SWAGGER2的对象
@Configuration
@EnableSwagger2
@EnableAutoConfiguration
@ConditionalOnProperty(name = "swagger.enabled", matchIfMissing = true)
public class SwaggerAutoConfiguration {

    // 默认的排除路径, 排除SPRING BOOT默认的错误处理路径和端点
    private static final List<String> DEFAULT_EXCLUDE_PATH = Arrays.asList("/error", "/actuator/**");

    private static final String BASE_PATH = "/**";

    @Bean
    @ConditionalOnMissingBean
    public SwaggerProperties swaggerProperties() {
        return new SwaggerProperties();
    }

    @Bean
    public Docket api(SwaggerProperties swaggerProperties) {
        // base-path处理
        if (swaggerProperties.getBasePath().isEmpty()) {
            swaggerProperties.getBasePath().add(BASE_PATH);
        }
        // SWAGGER会解析的URL规则的处理, 将配置的需要解析的URL规则放进LIST中
        List<Predicate<String>> basePath = new ArrayList<Predicate<String>>();
        swaggerProperties.getBasePath().forEach(path -> basePath.add(PathSelectors.ant(path)));

        // 在BASE-PAHT基础上需要排除的URL规则的处理, 将配置的需要排除的URL规则放进LIST中
        if (swaggerProperties.getExcludePath().isEmpty()) {
            swaggerProperties.getExcludePath().addAll(DEFAULT_EXCLUDE_PATH);
        }
        List<Predicate<String>> excludePath = new ArrayList<>();
        swaggerProperties.getExcludePath().forEach(path -> excludePath.add(PathSelectors.ant(path)));
        return new Docket(DocumentationType.SWAGGER_2)
                .host(swaggerProperties.getHost())
                // 在API-INFO中构建文档的基本信息. 例如描述、联系人信息、版本、标题等
                .apiInfo(apiInfo(swaggerProperties)).select()
                // 通过APIS方法配置要扫描的CONTROLLER的位置(会解析的包路径)
                .apis(RequestHandlerSelectors.basePackage(swaggerProperties.getBasePackage()))

                // [GUVA]通过PATHS方法配置路径(会解析的URL规则, 需要在BASE-PAHT的基础上排除不需要解析的URL规则)
                .paths(Predicates.and(Predicates.not(Predicates.or(excludePath)), Predicates.or(basePath)))

                .build()
                .pathMapping("/");

    }
    // 文档基本信息
    private ApiInfo apiInfo(SwaggerProperties swaggerProperties) {
        return new ApiInfoBuilder()
                .title(swaggerProperties.getTitle())
                .description(swaggerProperties.getDescription())
                .license(swaggerProperties.getLicense())
                .licenseUrl(swaggerProperties.getLicenseUrl())
                .termsOfServiceUrl(swaggerProperties.getTermsOfServiceUrl())
                .contact(new Contact(swaggerProperties.getContact().getName(), swaggerProperties.getContact().getUrl(), swaggerProperties.getContact().getEmail()))
                .version(swaggerProperties.getVersion())
                .build();
    }
}
5. 创建SWAGGER2配置对象
@Data
@Component
@ConfigurationProperties("swagger")
public class SwaggerProperties {

    // 是否开启SWAGGER2
    private Boolean enabled;

    // SWAGGER会解析的包路径
    private String basePackage = "";

    // SWAGGER会解析的URL规则
    private List<String> basePath = new ArrayList<>();

    // 在BASE-PAHT基础上需要排除的URL规则
    private List<String> excludePath = new ArrayList<>();

    // 文档标题(如: 广告服务接口文档)
    private String title = "";

    // 文档描述(如: 该文档用于描述广告服务提供的接口)
    private String description = "";

    // 文档的版本
    private String version = "1.0";

    // 许可证
    private String license = "Powered By hadoopx";

    // 许可证URL
    private String licenseUrl = "http://hadoopx.cn";

    // 服务条款URL
    private String termsOfServiceUrl = "";

    // HOST信息
    private String host = "";

    // 联系人信息
    private Contact contact = new Contact();

    // 全局统一鉴权配置
    private Authorization authorization = new Authorization();

    @Data
    public static class Contact {
        // 联系人
        private String name = "ROCKY";
        // 联系人URL
        private String url = "";
        // 联系人邮箱
        private String email = "";
    }
    @Data
    public static class Authorization {
        // 鉴权策略ID,需要和SecurityReferences ID保持一致
        private String name = "";

        // 需要开启鉴权URL的正则
        private String authRegex = "^.*$";

        // 鉴权作用域列表
        private List<AuthorizationScope> authorizationScopeList = new ArrayList<>();

        private List<String> tokenUrlList = new ArrayList<>();
    }
    @Data
    public static class AuthorizationScope {
        // 作用域名称
        private String scope = "";
        // 作用域描述
        private String description = "";
    }
}
6. 配置场景启动器的加载策略
// 在resources/META-INF/spring.factories的文件中添加如下配置:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.hadoopx.common.swagger.config.SwaggerAutoConfiguration
7. 编译打包…

如何使用

1. 引入依赖, 在微服务的POM.XML中添加如下依赖

   <!-- SWAGGER注解 -->
   <dependency>
       <groupId>com.hadoopx</groupId>
       <artifactId>servicex-common-swagger</artifactId>
       <version>${servicex.version}</version>
   </dependency>

2. 添加注解, 在微服务的启动类中添加如下依赖
   @EnableServiceSwagger2

3. 在线API文档
   http://微服务的IP或者LOCALHOST:微服务的端口号/swagger-ui.html
【讯飞星火大模型AI】SpringBoot整合星火API:从零构建智能数据分析助手 本文详细介绍了如何使用SpringBoot框架整合讯飞星火大模型API,从零构建一个智能数据分析助手。通过清晰的步骤,指导开发者完成API密钥申请、项目搭建、SDK集成与核心代码编写,实现用户通过自然语言指令和CSV数据,即可自动获得ECharts图表代码与专业数据分析结论,极大降低数据分析与可视化的门槛。 阅读详情

相关推荐

从像素到光影:解析《黑神话:悟空》中Nanite与Lumen的协同渲染革命

本文深度解析了《黑神话:悟空》如何利用Unreal Engine 5的Nanite与Lumen技术实现渲染革命。Nanite处理亿级多边形几何细节,无需传统LOD优化;Lumen提供全动态全局光照,实现实时光线反弹。两者协同工作,为游戏带来电影级视觉体验,重塑了实时渲染的技术标准与工作流程。

f6g7h8i9j的博客 425

springboot项目引用公共模块的bean

springboot项目需要将模块定义成公共模块,提供其他模块方便调用,如rabbitmq的Queue和Exchange需要在消息发送方和消息消费方公用,如果先启动服务消费方,会报错,找不到对应的Queue和Exchange问题。将对应的bean定义在公共模块,供消息发送方和消息消费方引入依赖,但是在引入对应模块中没有对应的Bean。

喜欢分享,善于记录工作中遇到的问题,和自己的思考 1016

Hyper-V集群部署指南

工欲善其事,必先利其器。搭建一个方便管理的服务集群,是分布式学习很重要的环境。 目前流行的虚拟机产品主要为Vmware 和 win10自带的Hyper-V(win10家庭版无此功能),网上关于Vmware的教程更多,显然它更容易上手,但Hyper-V也算是一个很不错的产品,这里记录一下我的学习过程: 目录 Hyper-V的安装 服务集群的搭建 虚拟机的网络通信 NAT网络的搭建 端口映射 Linux的静态IP 虚拟机的自启动问题 Hyper-V的安装 也不能算说是安装,如果你的win1

Swing 6922

SpringBoot 公共模块配置

在common-provide模块中,定义了一些公共服务,如FileService文件上传服务,系统配置服务,这些服务在其他的业务模块很多地方会用到,接下来通过配置后,在merchant-provider模块中调用common-provide模块中的FileService服务接口。因此比较好的做法是,将扫描路径配置到common-provider模块的自定已配置类中,让公共模块自动扫描,而不依赖调用方来指定路径,这样其他业务模块就不用再重复的配置扫描路径了,只需要在pom文件中引入该模块即可。

ntyrs的专栏 3049

Bybit面经

这段总结描述了求职者在Bybit面试过程中的经历和相关问题,包括面试内容、求职者向面试官提问的问题以及关于Bybit的信息

郑泽洲的博客 2583

基于simulink的多能源系统协同控制的复杂场景实例:氢燃料电池+锂电池混合动力电动汽车能量管理仿真

本文介绍了基于Simulink的氢燃料电池与锂电池混合动力电动汽车能量管理系统的建模与仿真方法。系统包含驾驶循环输入、氢燃料电池、锂电池、能量管理和电机驱动等模块,通过Simulink实现各模块的协同控制。文章详细说明了从模型创建到性能评估的完整流程,包括驾驶循环输入设置、燃料电池和锂电池子系统建模、能量管理策略设计等关键步骤。该仿真模型可验证不同工况下的系统响应和能量利用效率,为优化混合动力汽车的能量管理策略提供有效工具。通过引入更复杂的物理细节和环境因素,可进一步提升模型的实用性和准确性。

xiaoheshang_123的博客 368

springboot starter自定义实现公共模块

springboot starter自定义实现公共模块

liaomingwu的专栏 2637

Nvidia Driveos SDK/PDK介绍

NVIDIA DRIVEOS SDK/PDK介绍

u011803281的博客 2178

微服务Springboot怎么调用公共模块的Swagger配置类

微服务怎么调用公共模块的配置类 前言 因为在SpringBoot中,我们都会用一个专门的配置文件夹,放置配置类。但是,一旦到了 微服务的阶段,所有的一切都是按照模块进行开发。那么配置类就一般就会放在一个专门的模块中了,但是又如何去调用,这个模块呢? 接下来我以swagger这个接口管理文档为例 1.先建立一个common模块 2.将该子模块进入父模块进行管理,在pom文件中加入子模块 3.编写配置类Swagger package com.retallife.demo; import com.googl

weixin_45969142的博客 2634

基于NSGA2算法的无人机三维路径规划MATLAB实现

传统的路径规划方法多采用启发式搜索算法,然而这些方法往往带着局限性,不能有效地克服无人机飞行任务中所遇到的复杂环境与约束。而基于遗传算法的NSGA2(Non-dominated Sorting Genetic Algorithm II)方法则可以在优化目标之间找到最好的平衡点,是一种十分优秀的解决方案。本文介绍了基于NSGA2算法的无人机三维路径规划MATLAB实现。NSGA2算法是一种多目标优化算法,通过非支配排序和拥挤度距离来评估个体的适应度和选择新个体,从而产生一组非支配解。3.选择新个体组成P1;

CyberLynxX的博客 982

TC8:IPv4_HEADER_05-09

所有主机都必须准备好接受最多576个字节的数据报我们知道最大传输单元MTU通常是1500个字节,也就是说一条IP数据报的Header+payload最大1500,那为什么这条测试用例又要求主机准备好接受最多576个字节的IP数据报呢。

jasonj333 512

接口和抽象类的异同

1.接口: package com.example.springboot.jiekouchouxianglei; public interface TestInterface { int get(int a,int b); void add (String a); //default关键字可以写方法体 default int show() { ...

qq_41799291的博客 224

OpenClaw界面操作手册:命令行与交互模式的正确打开方式

"test": {"description": "运行项目的测试套件","prompt": "请执行项目的测试命令,并分析测试结果。如果有失败的测试,请提供修复建议。},"lint": {"description": "运行代码检查","prompt": "请运行代码检查工具,分析所有警告和错误,并提供修复建议。},"doc": {"description": "为当前文件生成文档","prompt": "请为当前打开的文件生成完整的API文档,包括函数说明、参数描述、返回值类型和使用示例。

gaoxiang_120的专栏 3148

SpringBoot - SWAGGER3公共模块的抽象集成与使用(三)

SWAGGER3公共模块的抽象集成与使用。

记录并分享 732

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SpringBoot集成Swagger2

SpringBoot集成Swagger2 文章目录SpringBoot集成Swagger2参考资料集成Swagger2SpringBoot继承Swagger2一个简单的demo细化接口内容增加接口描述使用Model格式化输入输出指定相应状态码及结构抽象出通用Model接口分组管理美化界面接口规范项目代码 本文注重实践,理论介绍可自行google。本文将从Swagger2的集成开始,逐步完成一个具...

安澜公子的博客 750

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

springboot集成swagger2,解决访问404问题

现在主流的前后端分离开发,swagger是一个方便后端编写接口文档的开源项目,用于生成、描述、调用和可视化RESTful风格的Web服务。 1、pom引入jar,最新的3.0.0版本会报404,有点Bug,所以选择2.9.2 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <versi

白领说事的专栏 2万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Spring Boot + Swagger2 自动生成api接口文档

一、什么是Swagger 由于Spring Boot能够快速开发、便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API。由于存在多终端的情况(移动端,web前端,小程序等),所以我们会抽象出RESTful API并共用一些底层业务代码。 由于接口众多,并且细节复杂,所以催生了一些api框架,Swagger就凭借其使用简单、...

oyc的博客 1万+

Swagger2简介

由于Spring Boot能够快速开发、便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API。而我们构建RESTful API的目的通常都是由于多终端的原因,这些终端会共用很多底层业务逻辑,因此我们会抽象出这样一层来同时服务于多个移动端或者Web前端。 这样一来,我们的RESTful API就有可能要面对多个开发人员或多个开发团队:IOS开发、Androi...

记事本 8493

SpringBoot - SWAGGER中配置.pathMapping(“XXXX“)引发的404错误

.pathMapping("/dev-api"),只是一个附加的虚拟的路径,并没有实际映射作用到对应的@RequestMapping的路径上,实际的访问路径依然是去掉请求前缀"/dev-api"的,但是它会作用到生成SWAGGER-DOC里的API路径上,会在API路径的前面拼接上前缀,所以直接访问会报错。在前后端分离架构上,SWAGGER-UI使用iframe方式嵌套,生成的服务地址也是前端暴露的地址端口,然后请求过来时将请求代理到后端的目标地址上,同时前端会去掉请求前缀。

记录并分享 4537

springboot整合swagger2

1、swagger2配置类 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springf...

学无止境! 468

Java效率工具swagger2

由于Spring Boot能够快速开发、便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API。而我们构建RESTful API的目的通常都是由于多终端的原因,这些终端会共用很多底层业务逻辑,因此我们会抽象出这样一层来同时服务于多个移动端或者Web前端。 这样一来,我们的RESTful API就有可能要面对多个开发人员或多个开发团队:IOS开发、Androi...

dxx707099957的博客 1183

springboot中集成swagger

由于Spring Boot能够快速开发、便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API。而我们构建RESTful API的目的通常都是由于多终端的原因,这些终端会共用很多底层业务逻辑,因此我们会抽象出这样一层来同时服务于多个移动端或者Web前端。 这样一来,我们的RESTful API就有可能要面对多个开发人员或多个开发团队:IOS开发、Andr

张肖的博客 1757

swagger 接口参数顺序_STEP7.1 集成swagger2实现接口文档

在STEP6中,我们主要围绕“前后端如何进行数据交互”展开学习。而在本本节中,我们针对的则是“前后端如何展开协作”。接口文档是前后端开发者之间最重要的沟通桥梁,也是展开协作的基础。那么什么是接口?其实接口的核心也就是我们的@RequestMapping后面写的参数url。但接口还包含一些其他的含义,例如:是什么请求方式(Get Post等)?传一些什么参数?参数是否必传?有哪些返回情况?等等。而接...

weixin_39632293的博客 385

Swagger使用教程及Swagger增强工具knife4j

Swagger使用教程,Swagger增强工具knife4j

忆往昔的博客 3378

SpringBoot中使用Swagger2构建强大的RESTful API文档

由于Spring Boot能够快速开发、便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API。而我们构建RESTful API的目的通常都是由于多终端的原因,这些终端会共用很多底层业务逻辑,因此我们会抽象出这样一层来同时服务于多个移动端或者Web前端。 这样一来,我们的RESTful API就有可能要面对多个开发人员或多个开发团队:IOS开发、Androi...

Jacians' Blog 187
上一篇: 如何开启IDEA的Run Dashboard功能
下一篇: SpringBoot - @ConditionalOnProperty注解使用详解
cloneme01
博客等级 码龄20年 2万+粉丝 248原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cloneme01

谢谢您的支持与鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值