SpringBoot集成Swagger2并配置多个包路径扫描
1. 简介
随着现在主流的前后端分离模式开发越来越成熟,接口文档的编写和规范是一件非常重要的事。简单的项目来说,对应的controller在一个包路径下,因此在Swagger配置参数时只需要配置一个包路径即可。但是对于复杂的项目,往往需要分模块开发,因此对应的controller包存在多个,所以需要在Swagger配置参数时需要指定多个包路径扫描。
在一些普遍情况下,分模块开发时由不同的开发小组来完成,为了保证接口文档的风格统一和方便,在公共模块指定统一的配置工具类,其他模块只需要配置自己的模块名称、编码和指定包路径,即可完成接口文档的配置,大大方便管理和开发。
2. Swagger2相关文章
3. Swagger配置多个包路径扫描示例代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import springfox.documentation.RequestHandler;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
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;
/**
* Swagger2配置类
*
* @author CL
*
*/
@Configuration
@EnableSwagger2
public class Swagger2Config {
/**
* 定义分隔符
*/
private static final String splitor = ";";
/**
* 注入Docket
*
* @return
*/
@Bean
public Docket docket() {
String basePackages = "com.c3stones.sys.controller" + splitor + "com.c3stones.common.controller";
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select().apis(basePackage(basePackages))
.paths(PathSelectors.any()).build();
}
/**
* 声明基础包
*
* @param basePackage 基础包路径
* @return
*/
public static Predicate<RequestHandler> basePackage(final String basePackage) {
return input -> declaringClass(input).transform(handlerPackage(basePackage)).or(true);
}
/**
* 校验基础包
*
* @param basePackage 基础包路径
* @return
*/
private static Function<Class<?>, Boolean> handlerPackage(final String basePackage) {
return input -> {
for (String strPackage : basePackage.split(splitor)) {
boolean isMatch = input.getPackage().getName().startsWith(strPackage);
if (isMatch) {
return true;
}
}
return false;
};
}
/**
* 检验基础包实例
*
* @param requestHandler 请求处理类
* @return
*/
@SuppressWarnings("deprecation")
private static Optional<? extends Class<?>> declaringClass(RequestHandler requestHandler) {
return Optional.fromNullable(requestHandler.declaringClass());
}
/**
* 配置在线文档的基本信息
*
* @return
*/
private static ApiInfo apiInfo() {
return new ApiInfoBuilder().title("SpringBoot集成Swagger2并配置多个包路径扫描示例")
.contact(new Contact("Powered By C3Stones", "https://www.cnblogs.com/cao-lei", null))
.termsOfServiceUrl("https://www.cnblogs.com/cao-lei/").version("V1.0").build();
}
}
4. 多模块分工开发时配置
- 定义公共配置类
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ResponseBody;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import springfox.documentation.RequestHandler;
import springfox.documentation.builders.ApiInfoBuilder;
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;
/**
* Swagger2配置工具类
*
* @author CL
*
*/
@Component
@EnableSwagger2
public class Swagger2ConfigUtils {
/**
* 配置模块
*
* @param moduleCode 模块Code
* @param moduleName 模块名称
* @param basePackage 基础包(多个)
* @return
*/
public static Docket docket(String moduleCode, String moduleName, String... basePackage) {
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo(moduleName)).groupName(moduleCode).select()
.apis(Predicates.and(RequestHandlerSelectors.withMethodAnnotation(ResponseBody.class),
basePackage(basePackage)))
.build();
}
/**
* 声明基础包
*
* @param basePackage 基础包路径
* @return
*/
public static Predicate<RequestHandler> basePackage(final String... basePackage) {
return input -> declaringClass(input).transform(handlerPackage(basePackage)).or(true);
}
/**
* 校验基础包
*
* @param basePackage 基础包路径
* @return
*/
private static Function<Class<?>, Boolean> handlerPackage(final String... basePackage) {
return input -> {
for (String strPackage : basePackage) {
boolean isMatch = input.getPackage().getName().startsWith(strPackage);
if (isMatch) {
return true;
}
}
return false;
};
}
/**
* 检验基础包实例
*
* @param requestHandler 请求处理类
* @return
*/
@SuppressWarnings("deprecation")
private static Optional<? extends Class<?>> declaringClass(RequestHandler requestHandler) {
return Optional.fromNullable(requestHandler.declaringClass());
}
/**
* 配置在线文档的基本信息
*
* @return
*/
private static ApiInfo apiInfo(String moduleName) {
return new ApiInfoBuilder().title(moduleName)
.contact(new Contact("Powered By C3Stones", "https://www.cnblogs.com/cao-lei", null))
.termsOfServiceUrl("https://www.cnblogs.com/cao-lei/").version("V1.0").build();
}
}
- 在其他模块中使用
例如:核心模块、商城模块。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.c3stones.common.utils.Swagger2ConfigUtils;
import springfox.documentation.spring.web.plugins.Docket;
/**
* Core模块Swagger2配置类
*
* @author CL
*
*/
@Configuration
public class CoreSwagger2Config {
/**
* 新增Core模块
*
* @return
*/
@Bean
public Docket coreApi() {
String moduleCode = "core";
String moduleName = "核心模块";
String[] basePackage = { "com.c3stones.sys.controller", "com.c3stones.common.controller" };
return Swagger2ConfigUtils.docket(moduleCode, moduleName, basePackage);
}
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.c3stones.common.utils.Swagger2ConfigUtils;
import springfox.documentation.spring.web.plugins.Docket;
/**
* Shop模块Swagger2配置类
*
* @author CL
*
*/
@Configuration
public class ShopSwagger2Config {
/**
* 新增Shop模块
*
* @return
*/
@Bean
public Docket shopApi() {
String moduleCode = "shop";
String moduleName = "商城模块";
String basePackage = "com.c3stones.order.controller";
return Swagger2ConfigUtils.docket(moduleCode, moduleName, basePackage);
}
}
- 启动项目
5. 测试
- 浏览器访问
# 因为使用了其他的Swagger UI(https://github.com/xiaoymin/swagger-bootstrap-ui),因此路径变为/doc.html
# 若使用原生的UI,则请求:http://127.0.0.1:8080/swagger-ui.html
http://127.0.0.1:8080/doc.html
- 截图(原生UI和新UI)
6. 项目地址
SpringBoot集成Swagger2并配置多个包路径扫描的更多相关文章
- SpringBoot集成Swagger2实现Restful(类型转换错误解决办法)
1.pom.xml增加依赖包 <dependency> <groupId>io.springfox</groupId> <artifactId>spri ...
- springboot集成swagger2构建RESTful API文档
在开发过程中,有时候我们需要不停的测试接口,自测,或者交由测试测试接口,我们需要构建一个文档,都是单独写,太麻烦了,现在使用springboot集成swagger2来构建RESTful API文档,可 ...
- SpringBoot集成Swagger2在线文档
目录 SpringBoot集成Swagger2在线文档 前言 集成SpringBoot 登录接口文档示例 代码 效果 注解说明 总结 SpringBoot集成Swagger2在线文档 前言 不得不说, ...
- springboot 集成swagger2.x 后静态资源报404
package com.bgs360.configuration; import org.springframework.context.EnvironmentAware; import org.sp ...
- springboot集成swagger2报Illegal DefaultValue null for parameter type integer
springboot集成swagger2,实体类中有int类型,会报" Illegal DefaultValue null for parameter type integer"的 ...
- springboot 集成swagger2
使用Swagger 可以动态生成Api接口文档,在项目开发过程中可以帮助前端开发同事减少和后端同事的沟通成本,而是直接参照生成的API接口文档进行开发,提高了开发效率.这里以springboot(版本 ...
- [转] spring-boot集成swagger2
经测,spring-boot版本使用1.5.2+时需使用springfox-swagger2版本2.5+(spring-boot 1.2 + springfox-swagger2 2.2 在未扫描ja ...
- SpringBoot 集成Swagger2自动生成文档和导出成静态文件
目录 1. 简介 2. 集成Swagger2 2.1 导入Swagger库 2.2 配置Swagger基本信息 2.3 使用Swagger注解 2.4 文档效果图 3. 常用注解介绍 4. Swagg ...
- 【java框架】SpringBoot(3) -- SpringBoot集成Swagger2
1.SpringBoot web项目集成Swagger2 1.1.认识Swagger2 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体 ...
随机推荐
- unctf2020 部分简单题题解
unctf2020 水一波简单题..菜狗前来报道..大佬轻喷..如果有时间做题就好了呜呜呜 misc 1.baba_is_you 题目告诉我们,了解png文件格式. 下载得到一张png格式的图片. 用 ...
- 深度分析:mybatis的底层实现原理,看完你学会了吗?
前言 最近在和粉丝聊天的时候被粉丝问到jdbc和mybatis底层实现这一块的问题,而且还不止一个小伙伴问到,于是我似乎认识到了问题的严重性,我花了两天时间整理了一下自己的认识和网上查阅的资料写了这篇 ...
- Camtasia中对录制视频进行编辑——视觉效果
视频剪辑对很多人来说是一件很头痛的事,因为对着屏幕一下一下的进行调整会让人十分的心烦,导致花费了时间但是剪辑出来的视频质量却并不高.或许是因为你没有选择一款合适的软件,因为一款高质量的软件往往会给人带 ...
- FL Studio中的Fruity slicer采样器功能介绍
本章节采用图文结合的方式来给大家介绍电音编曲软件FL Studio中的Fruity Slicer采样器的功能,感兴趣的朋友可一起来交流哦. Fruity slicer(水果切片器)插件是FL Stud ...
- 教你用Vegas Pro制作视频的遮罩转场特效
很多小伙伴在接触了Vegas之后,都想利用Vegas制作出各种酷炫的特效.小编也是一样. 今天,小编就和大家分享一下,小编近期学会的遮罩转场特效. 首先想要制作遮罩转场效果,需要的素材有:至少两个图片 ...
- 适合 Java 新手的开源项目集合——在 GitHub 学编程
作者:HelloGitHub--老荀 当今互联网份额最大的编程语言是哪一个?是 Java!这两年一直有听说 Java 要不行了.在走下坡路了.没错,Java 的确在走下坡路,未来的事情的确不好说,但是 ...
- C语言讲义——头文件
头文件.h Dev C++可以建C项目,也可以建C++项目,下面分C和C++两种情况讨论. c.h C语言中,头文件往往不是必须的,只是描述性的文件. 因此,C项目中可以没有.h文件. cpp.h 下 ...
- Java集合【8】-- ArrayList源码分析
目录 1. ArrayList 1.1 ArrayList特点介绍 1.2 实现的接口和继承的类 2. 成员变量 3. 构造方法 4. 常用增删改查方法 添加元素 查询元素 更新元素 删除元素 5.自 ...
- sentinel整合servlet
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-web-ser ...
- LaTex中的中文处理方法
相关代码与注释: 显示效果: