按Module动态注册Swagger Docket

阅读更多

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

按Module动态注册Swagger Docket_第1张图片

应用场景

一个服务下有多个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 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 packageList(){

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

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

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

  63.            if (handlerMapping instanceof RequestMappingHandlerMapping){

  64.                RequestMappingHandlerMapping requestMappingHandlerMapping = (RequestMappingHandlerMapping) handlerMapping;

  65.                Map handlerMethods = requestMappingHandlerMapping.getHandlerMethods();

  66.                for (Map.Entry 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. }

 

 

 

你可能感兴趣的:(Swagger)