暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

按Module动态注册Swagger Docket

算法技术猿 2018-11-30
904

应用场景

一个服务下有多个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.    private ConfigurableApplicationContext configurableApplicationContext;


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

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


  12.    @Override

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

  14.        this.configurableApplicationContext = (ConfigurableApplicationContext) applicationContext;

  15.    }


  16.    private ApiInfo apiInfo(String groupName){

  17.        return new ApiInfoBuilder()

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

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

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

  21.                       .version("1.0")

  22.                       .build();

  23.    }


  24.    /**

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

  26.     * @return

  27.     */

  28.    @Bean

  29.    public String createDocket(){

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

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

  32.            packageList.forEach(packages -> {

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

  34.                beanDefinitionBuilder.addConstructorArgValue(DocumentationType.SWAGGER_2);

  35.                BeanDefinition beanDefinition = beanDefinitionBuilder.getRawBeanDefinition();

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

  37.                beanFactory.registerBeanDefinition(packages, beanDefinition);

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

  39.                docket.groupName(packages)

  40.                        .apiInfo(apiInfo(packages))

  41.                        .select()

  42.                        .apis(RequestHandlerSelectors.basePackage(packages))

  43.                        .paths(PathSelectors.any())

  44.                        .build();

  45.            });

  46.        }

  47.        return "createDocket";

  48.    }


  49.    /**

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

  51.     * @return

  52.     */

  53.    private Set<String> packageList(){

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

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

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

  57.            if (handlerMapping instanceof RequestMappingHandlerMapping){

  58.                RequestMappingHandlerMapping requestMappingHandlerMapping = (RequestMappingHandlerMapping) handlerMapping;

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

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

  61.                    HandlerMethod mappingInfoValue = requestMappingInfoHandlerMethodEntry.getValue();

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

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

  64.                        packageSet.add(packageName);

  65.                    }

  66.                }

  67.            }

  68.        }

  69.        return packageSet;

  70.    }

  71. }


文章转载自算法技术猿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论