按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
程式碼實現
-
/**
-
* @author 千本櫻
-
* @date 2018/11/29
-
* @description 動態註冊Swagger Docket,Controller所在的包名即是Docket分組名稱
-
*/
-
@Component
-
@EnableSwagger2
-
public class RegistryDocket implements ApplicationContextAware {
-
-
private ConfigurableApplicationContext configurableApplicationContext;
-
-
private static final String SPRING_FOX_PACKAGE = "springfox.documentation";
-
private static final String SPRING_PACKAGE = "org.springframework";
-
-
@Override
-
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
-
this.configurableApplicationContext = (ConfigurableApplicationContext) applicationContext;
-
}
-
-
private ApiInfo apiInfo(String groupName){
-
return new ApiInfoBuilder()
-
.title(groupName + "模組Api文件")
-
.description("簡單優雅的restfun風格,http://localhost:8080")
-
.termsOfServiceUrl("http://localhost:8080")
-
.version("1.0")
-
.build();
-
}
-
-
/**
-
* 根據請求地址所在的包名,動態註冊多個Docket
-
* @return
-
*/
-
@Bean
-
public String createDocket(){
-
Set<String> packageList = packageList();
-
if (!CollectionUtils.isEmpty(packageList)){
-
packageList.forEach(packages -> {
-
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(Docket.class);
-
beanDefinitionBuilder.addConstructorArgValue(DocumentationType.SWAGGER_2);
-
BeanDefinition beanDefinition = beanDefinitionBuilder.getRawBeanDefinition();
-
BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) configurableApplicationContext.getBeanFactory();
-
beanFactory.registerBeanDefinition(packages, beanDefinition);
-
Docket docket = configurableApplicationContext.getBean(packages, Docket.class);
-
docket.groupName(packages)
-
.apiInfo(apiInfo(packages))
-
.select()
-
.apis(RequestHandlerSelectors.basePackage(packages))
-
.paths(PathSelectors.any())
-
.build();
-
});
-
}
-
return "createDocket";
-
}
-
-
/**
-
* 獲取包名列表,排除Spring框架和springfox框架的包
-
* @return
-
*/
-
private Set<String> packageList(){
-
Set<String> packageSet = new HashSet<>();
-
Map<String, HandlerMapping> handlerMappingMap = BeanFactoryUtils.beansOfTypeIncludingAncestors(configurableApplicationContext, HandlerMapping.class);
-
for (HandlerMapping handlerMapping : handlerMappingMap.values()){
-
if (handlerMapping instanceof RequestMappingHandlerMapping){
-
RequestMappingHandlerMapping requestMappingHandlerMapping = (RequestMappingHandlerMapping) handlerMapping;
-
Map<RequestMappingInfo, HandlerMethod> handlerMethods = requestMappingHandlerMapping.getHandlerMethods();
-
for (Map.Entry<RequestMappingInfo, HandlerMethod> requestMappingInfoHandlerMethodEntry : handlerMethods.entrySet()){
-
HandlerMethod mappingInfoValue = requestMappingInfoHandlerMethodEntry.getValue();
-
String packageName = mappingInfoValue.getBeanType().getPackage().getName();
-
if (!packageName.contains(SPRING_FOX_PACKAGE) && !packageName.contains(SPRING_PACKAGE)){
-
packageSet.add(packageName);
-
}
-
}
-
}
-
}
-
return packageSet;
-
}
-
}