Swagger UI 可视化 web API 文档、Multiple Dockets with the same group name are not supported.
目录
Swagger UI 概 述
Swagger UI 快速入门
Swagger UI 常用注解
Multiple Dockets with the same group name are not supported.
Swagger UI 概 述
1、Swagger 官网:API Documentation & Design Tools for Teams | Swagger 提供了以下几种开源工具,分别提供了相应的功能,本文只关心 Swagger UI 。
REST API Documentation Tool | Swagger UI
Swagger Codegen | 通过 Codegen 可以将描述文件生成 html 格式和 cwiki 形式的接口文档,同时也能生成多钟语言的服务端和客户端的代码。支持通过 jar 包,docker,node 等方式在本地化执行生成。也可以在 Swagger Editor 中在线生成。 |
Swagger UI | Swagger UI 允许任何人(无论是您的开发团队还是最终用户)在没有任何实现逻辑的情况下可视化并与 API 的资源交互。它是根据 OpenAPI(以前称为 Swagger)规范自动生成的,可视化文档使后端实现和客户端使用变得容易。 |
Swagger Editor: | 类似于 markendown 编辑器,支持在线编辑 Swagger 描述文件,以及实时预览描述文件的更新效果,也提供了在线编辑器和本地部署编辑器两种方式。 |
Swagger Inspector | 类似于 postman ,是一个可以对接口进行测试的在线版的 postman。比在 Swagger UI 里面做接口请求,会返回更多的信息,也会保存你请求的实际请求参数等数据。 |
Swagger Hub | 集成了上面所有项目的各个功能,可以以项目和版本为单位,将描述文件上传到 Swagger Hub 中,在 Swagger Hub 中可以完成上面项目的所有工作,需要注册账号,分免费版和收费版。 |
Swagger UI 快速入门
1、pom.xml 文件中导入 Swagger 依赖如下(本文环境:Java jdk 1.8 + Spring boot 2.1.3 + Swagger 2.9.2):
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version>
</dependency><!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version>
</dependency>
在线源码地址:pom.xml · 汪少棠/thymeleafapp - Gitee.com
特别提醒:从 3.0.0开始,可以直接引用 springfox-boot-starter 依赖,它内部依赖了springfox-swagger-ui与springfox-swagger2。
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-boot-starter -->
<!-- 从 3.0.0开始,可以直接引用如下依赖,它内部依赖了springfox-swagger-ui与springfox-swagger2 -->
<dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version>
</dependency>
2、配置 swagger,主要开启 swagger 功能,以及配置文档基本信息(在线源码 SwaggerConfig):
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
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;
/*** Swagger 配置* <p>* 1、@EnableSwagger2:表示应用开启 Swagger2 支持。* 2、@EnableSwagger2 注解需要和 @Configuration 注解一起使用* 3、@ConditionalOnProperty 使用自定义配置 sys.config.swagger-is-open,如果值为 true,则此配置类生效,* 否则如果不为 true,或者直接没有配置,则此配置类不会生效。通常上线后,swagger 在线文档可以关掉.** @author wangmaoxiong* @version 1.0* @date 2020/5/20 9:50*/
@Configuration
@EnableSwagger2
@ConditionalOnProperty(prefix = "sys.config", name = "swagger-is-open", havingValue = "true")
public class SwaggerConfig {/*** {@link Docket} 是一个构建器,它是 SpringFox 框架的主要接口,用于提供合理的默认值和方便的配置方法。* 1、必须使用 @Bean 将 Docket 添加到容器中* 2、DocumentationType.SWAGGER_2:表示 文档类型为 2.0 版本.* 3、apiInfo(ApiInfo apiInfo): 将 api 的元信息设置为包含在 ResourceListing 响应 json 中* 4、ApiSelectorBuilder select(): 启动用于 api 选择生成器。* 5、RequestHandlerSelectors.basePackage:表示生成 api 的基础包路径,即对这个包下进行扫描* 6、PathSelectors.any:表示对任意请求路径都加入文档、同理还有 none 都不加入、regex 满足正则的请求加入* 7、build(): 返回构建好的的 docket** @return*/@Beanpublic Docket docket() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(this.apiInfo()).select().apis(RequestHandlerSelectors.basePackage("com.wmx")).paths(PathSelectors.any()).build().pathMapping("");}/*** 创建 api 基本信息* 1、title(String title):页面标题内容,会显示在页面头部,默认 <h2> 标签包裹.* 2、description(String description):Api 描述信息,显示在 title 下方* 3、termsOfServiceUrl: 服务条款 url。页面上默认显示在描述信息下面,显示为 "Terms of service",然后用值作为超链接地址.* 4、version:更新版本* 5、contact:联系人信息,有: 名称、网站 url 地址、联系 email 地址。显示在服务条款下面。* 6、license:更新此 API 的许可证信息,显示在联系人下面* 7、这些值可以为空** @return*/private ApiInfo apiInfo() {return new ApiInfoBuilder().title("thymeleafApp 应用提供的 REST ful APIs").description("技术支持 2268461750@qq.com ").termsOfServiceUrl("https://wangmaoxiong.blog.csdn.net/").version("1.0").contact(new Contact("汪茂雄", "https://blog.csdn.net/wangmx1993328", "2268461750@qq.com")).license("马自达 & 汪茂雄 为您提供技术支持!").build();}
}
src/main/java/com/wmx/thymeleafapp/config/SwaggerConfig.java · 汪少棠/thymeleafapp - Gitee.com
@ConditionalOnProperty :使用自定义配置 sys.config.swagger-is-open,如果值为 true,则此配置类生效,否则如果不为 true,或者直接没有配置,则此配置类不会生效。通常上线后,swagger 在线文档可以关掉.
#自定义属性,是否开启 Swagger 在线文档功能,通常上线之后,可以关掉.
sys:config:swagger-is-open: true
src/main/resources/application.yml · 汪少棠/thymeleafapp - Gitee.com
3、此时便可以从浏览器访问了:
2.X 版本访问地址:http://localhost:8080/swagger-ui.html
3.X 版本访问地址:http://localhost:8080/swagger-ui/
可以看到 Swagger 默认会对 ApiSelectorBuilder.apis(RequestHandlerSelectors.basePackage("com.wmx")) 设置的基础包路径下的所有控制层进行扫描,并提供页面文档访问。
文档显示的内容有:控制层名称、方法名称、方法的访问路径、访问方式(如 get、post、put、delete等)、接口的参数名称、参数类型,返回值名称与类型、调用的示例等等。
swagger-ui.html 是 springfox-swagger-ui-x.x.x.jar 包中 META-INF/resources 目录下,属于 Spring boot 约定的四大静态目录之一,所以可以从页面直接访问。
4、如果应用中设置了拦截器或者权限认证,则可以对以下路径放开权限:/doc.html、/swagger-ui/**、/swagger/**、/swagger-resources/**、/**/v3/api-docs。
5、Swagger-UI 文档上面还可以直接对接口发起请求,而且不止支持 get 请求、post 等请求方式同样可以。
Swagger UI 常用注解
1、由上面快速入门可知,只要导入 Swagger 依赖,然后配置了 Swagger ,就可以在线生成文档,而且只要后台创建的类、方法名、参数名等命名的比较到位,从页面上浏览时也是很友好的。
2、如果想要添加中文注释方便阅读,则需要借助 Swagger 注解来实现,优点是阅读起来更加直观,缺点是后台代码需要额外添加 Swagger 代码,增加了负担以及影响美观。
3、所以推荐是:后台的 Swagger 注解编写的越简单越好,因为注解的各个属性通常都有默认值,比如参数类型、参数是否必填项等等,所以没必要反复设置。控制层关联的实体类都会一并显示。写的越少、Swagger 的侵入性就越低。
@Api |
1、将类标记为 Swagger 的资源,默认情况下 ApiSelectorBuilder.apis(RequestHandlerSelectors.basePackage("com.wmx")) 设置的基础包路径下的所有控制层进行扫描,所以控制层上,此注解可以省略不写。 2、可以用于 Class, interface,enum 上面,常用属性为 tags,用于给此 API 打上标签。 |
@ApiOperation | 1、描述针对特定路径的操作,通常用于 HTTP 方法上面。常用属性有: value - 方法的简要描述, notes - 方法的详细描述 |
@ApiImplicitParam |
1、描述单个参数,常用属性:name - 参数名称, value - 参数的简要说明, dataType - 参数的数据类型 , required - 参数是否为必须项, paramType - 参数的参数类型(可选值有 query,body,header,form) 2、这些属性都会默认赋值,通常只需要指定 name、value 即可。 3、对于参数是实体对象时,如 Person,此时不再推荐使用 @ApiImplicitParam,因为加了后,页面不再显示实体类的属性了,会把它当做普通的字符串,而不是实体。 |
@ApiImplicitParams | 1、当方法有多个参数时,用 @ApiImplicitParams 包裹 @ApiImplicitParam 。 |
@ApiIgnore |
1、当不想对某个控制层、或者方法、或者参数对外提供文档时,则可以使用 @ApiIgnore 标识进行忽略。可以用于类、接口、枚举、方法、参数上。 |
@ApiModel | 1、通常用于添加在实体对象上,可以使用 description 属性对实体类进行描述, |
@ApiModelProperty | 1、通常用于实体类的属性上,使用 name - 属性名称, value - 属性描述。 |
在线演示源码:/thymeleafapp/controller/PersonController.java · 汪少棠/thymeleafapp - Gitee.com
src/main/java/com/wmx/thymeleafapp/pojo/Person.java · 汪少棠/thymeleafapp - Gitee.com
Multiple Dockets with the same group name are not supported.
1、Spring Boot 环境原本还是好好的,修改配置文件后,给腾讯云环境打包的时候突然报如下错误:Multiple Dockets with the same group name are not supported. The following duplicate groups were discovered. default
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-04-11 15:04:14 ERROR [main] org.springframework.boot.SpringApplication:837 Application run failed
org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.IllegalStateException: Multiple Dockets with the same group name are not supported. The following duplicate groups were discovered. defaultat org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:185) ~[spring-context-5.0.11.RELEASE.jar!/:5.0.11.RELEASE]at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:53) ~[spring-context-5.0.11.RELEASE.jar!/:5.0.11.RELEASE]at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:360) ~[spring-context-5.0.11.RELEASE.jar!/:5.0.11.RELEASE]at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:158) ~[spring-context-5.0.11.RELEASE.jar!/:5.0.11.RELEASE]at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:122) ~[spring-context-5.0.11.RELEASE.jar!/:5.0.11.RELEASE]at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:883) ~[spring-context-5.0.11.RELEASE.jar!/:5.0.11.RELEASE]at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:163) ~[spring-boot-2.0.7.RELEASE.jar!/:2.0.7.RELEASE]at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551) ~[spring-context-5.0.11.RELEASE.jar!/:5.0.11.RELEASE]at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) ~[spring-boot-2.0.7.RELEASE.jar!/:2.0.7.RELEASE]at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) [spring-boot-2.0.7.RELEASE.jar!/:2.0.7.RELEASE]at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:386) [spring-boot-2.0.7.RELEASE.jar!/:2.0.7.RELEASE]at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) [spring-boot-2.0.7.RELEASE.jar!/:2.0.7.RELEASE]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1242) [spring-boot-2.0.7.RELEASE.jar!/:2.0.7.RELEASE]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1230) [spring-boot-2.0.7.RELEASE.jar!/:2.0.7.RELEASE]at grp.BgtBasicApplication.main(BgtBasicApplication.java:34) [classes!/:3.1.0.TX]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_282]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_282]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_282]at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_282]at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) [bgt-basic-controller-3.1.0.TX.jar:3.1.0.TX]at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) [bgt-basic-controller-3.1.0.TX.jar:3.1.0.TX]at org.springframework.boot.loader.Launcher.launch(Launcher.java:50) [bgt-basic-controller-3.1.0.TX.jar:3.1.0.TX]at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51) [bgt-basic-controller-3.1.0.TX.jar:3.1.0.TX]
Caused by: java.lang.IllegalStateException: Multiple Dockets with the same group name are not supported. The following duplicate groups were discovered. defaultat springfox.documentation.spring.web.plugins.DuplicateGroupsDetector.ensureNoDuplicateGroups(DuplicateGroupsDetector.java:45) ~[springfox-spring-web-2.9.2.TSF-RELEASE.jar!/:na]at springfox.documentation.spring.web.plugins.DocumentationPluginsManager.documentationPlugins(DocumentationPluginsManager.java:97) ~[springfox-spring-web-2.9.2.TSF-RELEASE.jar!/:na]at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.start(DocumentationPluginsBootstrapper.java:162) ~[springfox-spring-web-2.9.2.TSF-RELEASE.jar!/:na]at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:182) ~[spring-context-5.0.11.RELEASE.jar!/:5.0.11.RELEASE]... 22 common frames omitted
2、可能原因:注入了多个 swagger 而又没有进行分组,于是都分配到默认的组里,出现重复组 default 导致不支持。
3、解决办法: swagger 配置时进行分组。
@Bean
public Docket docket() {return new Docket(DocumentationType.SWAGGER_2).groupName("基础库服务接口") //分组.apiInfo(this.apiInfo()).select().apis(RequestHandlerSelectors.basePackage("com.wmx")).paths(PathSelectors.any()).build().pathMapping("");
}
Swagger UI 可视化 web API 文档、Multiple Dockets with the same group name are not supported.相关推荐
- SpringBoot整合Swagger 自动生成在线API文档 偷懒必备 同时也是我们的基本操作啦!!!
不知道哦昨天的七夕过的咋样,总之我就是在这new GirlFriend().在那netw GirlFriend(),就这样度过了一天.
- swagger api文档_带有Swagger的Spring Rest API –创建文档
swagger api文档 使REST API易于使用的真正关键是好的文档. 但是,即使您的文档做得很好,您也需要设置公司流程的权利以正确,及时地发布它. 确保利益相关者按时收到是一回事,但是您也要负 ...
- 微服务如何聚合 API 文档?这波操作也太秀了
今天这篇文章介绍一下微服务如何聚合Swagger实现接口文档管理. 文章目录如下: 为什么需要聚合? 微服务模块众多,如果不聚合文档,则访问每个服务的API文档都需要单独访问一个Swagger UI界 ...
- Node与apidoc的邂逅——NodeJS Restful 的API文档生成
作为后台根据需求文档开发完成接口后,交付给前台(angular vue等)做开发,不可能让前台每个接口调用都去查看你的后台代码一点点查找.前台开发若不懂你的代码呢?让他一个接口一个接口去问你怎么调用, ...
- PHP使用swagger-php自动生成api文档(详细附上完整例子)
thinkphp5结合swagger自动生成接口文档 整体介绍 swagger-php.swagger-ui.swagger-editor swagger-ui:主要就是放到tp项目public目录下 ...
- 在ASP.NET Core Web API上使用Swagger提供API文档
我在开发自己的博客系统(http://daxnet.me)时,给自己的RESTful服务增加了基于Swagger的API文档功能.当设置IISExpress的默认启动路由到Swagger的API文档页 ...
- Swagger UI教程 API 文档神器 搭配Node使用
一.node.js的安装 运行环境必须使用node.js,把其作为服务器来跑, 安装教程 二.swagger的安装 教程 对上面的图片进行进行讲解,教程博客中大部分都讲清楚了,所以我这里就不说了,在我 ...
- 从0到1手把手搭建spring cloud alibaba 微服务大型应用框架(十五) swagger篇 : gateway 集成swagger 与 knife4j实现在线api文档并嵌入到自己项目内
背景 我们日常开发中基本都是协同开发的,当然极个别的项目整体前后端都是一个人开发的,当多人协作时,尤其是前后端人员协同开发时 必然会面临着前端需要了解后端api接口的情况,两个选择,提前设计好文档,然 ...
- Spring MVC中使用Swagger生成API文档和完整项目示例Demo,swagger-server-api(二十)
一:Swagger介绍 Swagger是当前最好用的Restful API文档生成的开源项目,通过swagger-spring项目 实现了与SpingMVC框架的无缝集成功能,方便生成spring r ...
- Spring Boot 集成 Swagger 生成 RESTful API 文档
原文链接: Spring Boot 集成 Swagger 生成 RESTful API 文档 简介 Swagger 官网是这么描述它的:The Best APIs are Built with Swa ...
最新文章
- 某小公司RESTful、共用接口、前后端分离、接口约定的实践
- 如何更改jupyter notebook默认存储路径
- oracle之 变更OS时间对数据库的影响
- VS添加服务引用和 Web引用的区别
- java Hashtable的遍历方法
- 机器学习算法基础——数据降维
- 中计算散度的函数_荷畔微风 - 在函数计算FunctionCompute中使用WebAssembly
- Python编程专属骚技巧3
- set和map去重调用什么方法_你真的了解ES6的Set,WeakSet,Map和WeakMap吗?
- jsp论坛网站模版_网站被降权了?看看这些解决方法,或许有帮助哦
- python随笔系列--多进程多线程并发度初探
- c# key event
- Python 文本处理的几个库
- 软件相貌测试准确吗,测另一半的相貌超准软件 提前了解对象的外貌
- Excel-DATEDIF函数计算两日期天数差
- MAC安装STAF详解
- L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误
- php7 libevent扩展,php7下安装event扩展方法
- Leetcode0953. 验证外星语词典(simple)
- linux镜像文件目录,Linux - 系统 - 文件目录
热门文章
- 我开发的内部ORM(一)数据库组件
- 孙鑫VC学习笔记:第十三讲 (五) 保存可串行化的类对象 如何获取文档与视类指针
- clr20r3 程序终止的几种解决方案_IT外包桌面解决方案——不慌,蓝屏而已
- 拓端tecdat|R语言随机森林RandomForest、逻辑回归Logisitc预测心脏病数据和可视化分析
- 拓端tecdat|R语言stan进行基于贝叶斯推断的回归模型
- java编辑简单文本编辑器_简单文本编辑器
- python-判断一个字符串是目录还是文件及批处理方法
- 【C/C++】C++基本语法
- python mysql传入多个参数
- 如何利用Keras中的权重约束减少深度神经网络中的过拟合