`

按Module动态注册Swagger Docket

阅读更多

微信公众号文章列表:关注公众号(coding_song)阅读更清晰,附件为微信二维码

应用场景

一个服务下有多个Module,启动当前服务,每个Module生成一个Docket文档,方便分别查看每个Module下的接口

功能描述

(1)获取项目服务中的所有的请求URL (2)获取每个请求URL对应的Controller所在的包,保存包名称到Set集合中,并且排除spring框架和springfox框架的包 (3)如果每个Module下的所有Controller类,都定义在同一个包下,则Set集合中的一条数据对应一个Module (4)遍历Set集合,一条数据生成一个Swagger Docket Bean

代码实现

  1. /**

  2. * @author 千本樱

  3. * @date 2018/11/29

  4. * @description 动态注册Swagger Docket,Controller所在的包名即是Docket分组名称

  5. */

  6. @Component

  7. @EnableSwagger2

  8. public class RegistryDocket implements ApplicationContextAware {

  9.  

  10.    private ConfigurableApplicationContext configurableApplicationContext;

  11.  

  12.    private static final String SPRING_FOX_PACKAGE = "springfox.documentation";

  13.    private static final String SPRING_PACKAGE = "org.springframework";

  14.  

  15.    @Override

  16.    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

  17.        this.configurableApplicationContext = (ConfigurableApplicationContext) applicationContext;

  18.    }

  19.  

  20.    private ApiInfo apiInfo(String groupName){

  21.        return new ApiInfoBuilder()

  22.                       .title(groupName + "模块Api文档")

  23.                       .description("简单优雅的restfun风格,http://localhost:8080")

  24.                       .termsOfServiceUrl("http://localhost:8080")

  25.                       .version("1.0")

  26.                       .build();

  27.    }

  28.  

  29.    /**

  30.     * 根据请求地址所在的包名,动态注册多个Docket

  31.     * @return

  32.     */

  33.    @Bean

  34.    public String createDocket(){

  35.        Set<String> packageList = packageList();

  36.        if (!CollectionUtils.isEmpty(packageList)){

  37.            packageList.forEach(packages -> {

  38.                BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(Docket.class);

  39.                beanDefinitionBuilder.addConstructorArgValue(DocumentationType.SWAGGER_2);

  40.                BeanDefinition beanDefinition = beanDefinitionBuilder.getRawBeanDefinition();

  41.                BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) configurableApplicationContext.getBeanFactory();

  42.                beanFactory.registerBeanDefinition(packages, beanDefinition);

  43.                Docket docket = configurableApplicationContext.getBean(packages, Docket.class);

  44.                docket.groupName(packages)

  45.                        .apiInfo(apiInfo(packages))

  46.                        .select()

  47.                        .apis(RequestHandlerSelectors.basePackage(packages))

  48.                        .paths(PathSelectors.any())

  49.                        .build();

  50.            });

  51.        }

  52.        return "createDocket";

  53.    }

  54.  

  55.    /**

  56.     * 获取包名列表,排除Spring框架和springfox框架的包

  57.     * @return

  58.     */

  59.    private Set<String> packageList(){

  60.        Set<String> packageSet = new HashSet<>();

  61.        Map<String, HandlerMapping> handlerMappingMap = BeanFactoryUtils.beansOfTypeIncludingAncestors(configurableApplicationContext, HandlerMapping.class);

  62.        for (HandlerMapping handlerMapping : handlerMappingMap.values()){

  63.            if (handlerMapping instanceof RequestMappingHandlerMapping){

  64.                RequestMappingHandlerMapping requestMappingHandlerMapping = (RequestMappingHandlerMapping) handlerMapping;

  65.                Map<RequestMappingInfo, HandlerMethod> handlerMethods = requestMappingHandlerMapping.getHandlerMethods();

  66.                for (Map.Entry<RequestMappingInfo, HandlerMethod> requestMappingInfoHandlerMethodEntry : handlerMethods.entrySet()){

  67.                    HandlerMethod mappingInfoValue = requestMappingInfoHandlerMethodEntry.getValue();

  68.                    String packageName = mappingInfoValue.getBeanType().getPackage().getName();

  69.                    if (!packageName.contains(SPRING_FOX_PACKAGE) && !packageName.contains(SPRING_PACKAGE)){

  70.                        packageSet.add(packageName);

  71.                    }

  72.                }

  73.            }

  74.        }

  75.        return packageSet;

  76.    }

  77. }

 

 

 

0
0
分享到:
评论

相关推荐

    swagger-editor-docker:Swagger编辑器的Docker映像,可让您在浏览器中的YAML中编辑Swagger API规范并实时预览文档

    Swagger编辑器Docker映像可让您在浏览器中的YAML中编辑Swagger API规范,并实时预览文档。内容用法使用Docker启动容器使用Docker Compose启动容器建造使用Docker进行构建使用Docker Compose进行构建关于用法在随后的...

    swagger-ui-docker:Docker容器为Swagger UI提供服务

    在Docker容器中 ()跑步docker pull capoferro/swagger-uidocker run -d -p 80 capoferro/swagger-ui构建/运行git clone git://github.com/capoferro/swagger-ui-dockercd swagger-ui-dockerdocker build -t ...

    docker-swagger-ui:使用Nginx的Swagger UI Docker映像

    Docker的Swagger UI 该Dockerfile打包了Swagger UI并使用Nginx运行它。设置Swagger URL 您可以在运行时通过设置URL环境变量来设置Swagger URL。例子docker run -it --rm -p 3000:80 --name test -e "URL=...

    springboot整合mybatis多数据源动态配置 swagger

    以上就是关于"springboot整合mybatis多数据源动态配置 swagger"这一主题的知识点详解,涵盖了Spring Boot与MyBatis的整合、多数据源读写分离的实现,以及Swagger在API文档和测试中的应用。理解并掌握这些内容,对于...

    毕业设计,基于Springboot+SSM+Swagger+Docker的商城项目OnlineSchollShop,完整源代码

    毕业设计,基于Springboot+SSM+Swagger+Docker的商城项目OnlineSchollShop,完整源代码 毕业设计基于SSM/Springboot的商城项目,一个简单的商城,界面友好。实现了商城所有基本功能。 作为改写的基础模板,可以增加...

    swagger-blocks, 定义和服务 ruby 应用程序的动态更新 Swagger.zip

    swagger-blocks, 定义和服务 ruby 应用程序的动态更新 Swagger Swagger::Blocks Swagger::Blocks 是一个用于纯 ruby 代码块的DSL,可以转换为 JSON 。它帮助你以 Swagger 风格编写API文档,然后自动构建与 Swagger ...

    springboot+swagger-ui+PageHelper分页+logback+动态定时

    在本项目中,我们主要探讨的是如何利用SpringBoot框架,集成Swagger-UI、PageHelper、Logback以及动态定时任务的功能。下面将详细讲解这些技术及其整合应用。 首先,SpringBoot是一个由Pivotal团队开发的Java框架,...

    swagger2Demo,swagger

    Swagger是一个强大的API开发工具,主要用于设计、构建、文档化和使用RESTful web服务。在这个名为"swagger2Demo"的项目中,我们看到作者利用Swagger 2创建了一个演示应用,目的是为了展示如何使用Swagger来调试接口...

    Flask REST API项目实例,包含JWT认证、rq异步任务、Swagger文档、Redoc、Docker部署、uwsg等

    lask REST API项目示例,包含JWT认证、rq异步任务、Swagger文档、Redoc文档、Docker部署、uwsgi等 项目初始化 执行sh init.sh PROJECT_NAME 开发说明 修改build.sh和docker-compose.yml中镜像版本,执行build.sh...

    swagger开启身份认证

    ### swagger开启身份认证 在现代Web开发中,API文档自动生成工具如Swagger变得越来越重要,它们不仅能够提高开发效率,还能够帮助团队更好地管理和维护API接口。然而,随着API暴露给外部用户,安全问题也日益突出。...

    TP5集成swagger

    - **动态生成Swagger JSON文件**: - 在控制器中添加代码来指定要生成文档的文件夹路径,并使用`Swagger\scan()`方法扫描该文件夹中的注释。 - 生成的`swagger.json`文件将保存在预先定义好的路径下。 - 成功生成...

    swagger官方文档离线版

    Swagger官方文档离线版是开发人员和团队在不依赖互联网连接的情况下查阅Swagger 2.0规范的重要资源。Swagger是一个流行的API开发工具,它基于OpenAPI Specification(以前称为Swagger specification),用于设计、...

    swagger_java_swagger_

    Swagger 是一个流行的API开发工具,它提供了一套规范和实现,用于设计、构建、文档化和使用RESTful Web服务。在Java环境中,Swagger通常与Spring Boot框架结合使用,以简化API的开发和测试过程。本篇文章将深入探讨...

    swagger2.zip

    springboot 2.2.7集成swagger2.9.2,并生成markdown格式API文档. &lt;!-- swagger2 依赖开始--&gt; &lt;!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --&gt; &lt;groupId&gt;io.springfox ...

    cxf配置swagger2

    总的来说,"cxf配置swagger2"涉及到的步骤包括:添加依赖、创建Swagger配置类、配置Spring Boot应用扫描、以及在CXF服务中注册Swagger2 Feature。通过这些步骤,我们可以为CXF RESTful服务生成漂亮的文档并提供交互...

    springboot-dockerized:Swagger使用Docker插件启用了示例SpringBoot微服务,以从DockerHub创建映像,推送和拉取

    介绍一个基于Spring Boot的示例应用程序,它使用Docker插件构建应用程序的映像。 本文档列出了构建,推送映像并使用它来启动容器内的服务器的步骤。在DockerHub上创建帐户在创建帐户初始化本地泊坞窗以连接到您的...

    Swagger接口导出Word.rar

    在安装后,需要在`Startup.cs`文件中的`ConfigureServices`方法中注册Swagger服务: ```csharp services.AddSwaggerGen(c =&gt; { c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" }); }); `...

    swagger所有相关jar包

    Swagger是一个流行的API开发工具,主要用于构建、文档化和测试RESTful web服务。它提供了一种交互式的、基于HTTP的API接口,使得开发者可以轻松地理解并使用这些接口。Swagger通过JSON格式来描述API,使得服务的消费...

    swagger静态部分文件打包

    Swagger 是一个广泛使用的 API 设计和开发工具,它允许开发者以 YAML 或 JSON 格式定义 RESTful 风格的 Web 服务接口。这个压缩包文件 "swagger" 可能包含了 Swagger 的静态资源,这些资源主要用于展示和测试 API ...

Global site tag (gtag.js) - Google Analytics