1. 程式人生 > >按Module動態註冊Swagger Docket

按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. }