当前位置: 首页 > article >正文

springboot 动态注册swagger docket配置

背景

最近发现swagger文档接口越来越多,加载好像有点慢。想到swagger分组功能,想搞下,但是一想到需要写死docket的bean注册,这不服务有许多子应用设计,需要动态注册docket bean。

一、swagger配置

基于配置类向spring容器动态添加bean方式,就有下面的代码

StarterConfiguration配置类,当useGroup设置为true时候读取分组值,默认读取basePackage

package com.test.starter.swagger;

import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI;
import com.test.starter.swagger.SwaggerProperties.GroupRefBasePackage;

import lombok.extern.slf4j.Slf4j;

import java.util.Collections;
import java.util.List;
import java.util.Objects;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.ConfigurableEnvironment;
import springfox.documentation.PathProvider;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * swagger Dcoket配置
 */
@Configuration
@EnableSwagger2
@EnableSwaggerBootstrapUI
@Slf4j
public class StarterConfiguration {
	
	@Autowired
	private ConfigurableEnvironment environment;
	
    @Autowired
    private ConfigurableApplicationContext applicationContext;
    
    @Autowired
    private SwaggerProperties swaggerProperties;
    
    @Bean
    public SwaggerProperties swaggerProperties(){
    	return new SwaggerProperties();
    }
	
	@PostConstruct
	public void init(){
		
		List<GroupRefBasePackage> groupRefBasePackages = swaggerProperties.getUseGroup() 
				? swaggerProperties.getGroupRefBasePackages()
				: Collections.singletonList(GroupRefBasePackage.of("默认分组", swaggerProperties.getBasePackage()));
		
		for (GroupRefBasePackage groupRefBasePackage:groupRefBasePackages){	
			this.registerDocket(swaggerProperties, groupRefBasePackage.getGroupName(), groupRefBasePackage.getBasePackage());

		}
	}
    
    /**
     * 
     * 描述:注册Docket
     * @author sakyoka
     * @date 2025年3月19日 上午11:21:11
     * @param properties
     * @param groupName
     * @param basePackage
     */
    private void registerDocket(SwaggerProperties properties, String groupName, String basePackage) {
    	Docket docket = new Docket(DocumentationType.SWAGGER_2)
        		.groupName(groupName)
                .apiInfo(new ApiInfoBuilder()
                        .title(properties.getTitle())
                        .description(properties.getDescription())
                        .version(properties.getVersion())
                        .termsOfServiceUrl(properties.getTermsOfServiceUrl())
                        .build())
                .select()
                .apis(RequestHandlerSelectors.basePackage(basePackage))
                .paths(PathSelectors.any())
                .build();
    	
    	String beanName = Objects.isNull(groupName) ? "swaggerDocket" : basePackage + "SwaggerDocket";
    	log.debug("registerDocket =》 docket beanName:{},groupName:{},basePackage:{}", beanName, groupName, basePackage);
    	
    	applicationContext.getBeanFactory().registerSingleton(beanName, docket);
    }
    
}

SwaggerProperties配置类

package com.test.starter.swagger;

import lombok.Data;

import java.util.Collections;
import java.util.List;

import javax.validation.constraints.NotBlank;

import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * Swagger 配置属性
 */
@Data
@ConfigurationProperties("swagger")
public class SwaggerProperties {
    /**
     * Swagger 文档标题
     */
    private String title = "swagger 接口文档";
    /**
     * Swagger 描述
     */
    private String description = "swagger-bootstrap-ui";
    /**
     * 版本号
     */
    private String version = "1.0.0";
    /**
     * 服务地址
     */
    private String termsOfServiceUrl = "http://localhost:8080/";
    /**
     * 扫描包地址
     */
    private String basePackage = "com.test";
    
    /**
     * 是否使用接口分组
     */
    private Boolean useGroup = false;
    
    /**
     * 分组配置
     */
	private List<GroupRefBasePackage> groupRefBasePackages = Collections.emptyList();
	
	/**
	 * 
	 * 描述:swagger分组
	 * @author sakyoka
	 * @date 2025年3月19日 上午11:02:40
	 */
	@Data
	public static class GroupRefBasePackage {
		
		/**数据源*/
		@NotBlank
		private String groupName;
		
		/**包目录*/
		@NotBlank
		private String basePackage;

		/**
		 * 
		 * 描述:创建
		 * @author sakyoka
		 * @date 2025年3月19日 下午2:25:47
		 * @param groupName
		 * @param basePackage
		 * @return GroupRefBasePackage
		 */
		public static GroupRefBasePackage of(String groupName, String basePackage) {
			GroupRefBasePackage groupRefBasePackage = new GroupRefBasePackage();
			groupRefBasePackage.setGroupName(groupName);
			groupRefBasePackage.setBasePackage(basePackage);
			return groupRefBasePackage;
		}
	}
}

二、yml配置

swagger:
  title: 测试接口文档
  basePackage: com.test

  #开启分组
  useGroup: true
  groupRefBasePackages:
    - groupName: 1、测试接口文档1
      basePackage: com.test.api1
    - groupName: 2、测试接口文档2
      basePackage: com.test.api2


http://www.kler.cn/a/594897.html

相关文章:

  • 【总结篇】java多线程,新建线程有几种写法,以及每种写法的优劣势
  • Spring Boot整合Apache BookKeeper教程
  • 数据库:一文掌握 Elasticsearch 的各种指令(Elasticsearch指令备忘)
  • webpack的SplitChunksPlugin和在路由或组件级别进行拆分
  • 生物医药蛋白分子数据采集:支撑大模型训练的技术实践分享
  • leetcode热题100道——两数之和
  • SaaS系统的销售微服务与权限微服务边界设计
  • 进制转换(R转十)(1290. 二进制转换十进制、1292. 十六进制转十进制、1291. 八进制转十进制、1405. 小丽找潜在的素数)
  • 用电子表格语言”写软件”——FILTER函数学习与超级实践
  • 晶鑫股份迈向敏捷BI之路,永洪科技助力启程
  • 【华为OD-E卷 -122 字符统计及重排 100分(python、java、c++、js、c)】
  • STM32/GD32中时钟的作用
  • 使用LLM自动化生成微电网Simulink模型
  • Oracle 19C reverse反向索引测试
  • 【AIGC前沿】MiniMax海螺AI视频——图片/文本生成高质量视频
  • SQLark 实战 | 如何通过对象名和 DDL 快速搜索数据库对象
  • 任务分配器做负载均衡方案对比和选择
  • webrtc3A算法
  • Chapter 4-15. Troubleshooting Congestion in Fibre Channel Fabrics
  • C++程序从windows移植到linux后cmake脚本CMakeLists.txt的修改