Spring Boot3.x 使用SpringDoc生成接口文档-超级完善 + knife4jUI

这篇具有很好参考价值的文章主要介绍了Spring Boot3.x 使用SpringDoc生成接口文档-超级完善 + knife4jUI。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

为什么使用SpringDoc

在Springfox3.0停更的两年里,SpringBoot进入3.0时代, SpringFox出现越来越多的问题,最为明显的就是解析器的问题,已经在上文 中解释清楚,这里就不再赘述。
SpringDoc是Spring官方推荐的API,相信不会轻易停更。

如何引入SpringDoc

SpringDoc有多个版本,如果你使用的是SpringBoot3.x,请确保SpringDoc的版本在2.0以上,本文使用的版本是2.0.4,knife4j使用的版本是4.3.0

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
</dependency>

零、SpringFox的和SpringDoc 区别

springdoc header,spring boot,ui,后端

一、直接上代码:集成请求自定义全局鉴权策略参数,自定义分组

依赖knife4j jar

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
</dependency>

二、使用步骤

1.引入JAVA对象(SwaggerConfig.java,SwaggerGroupConfigEntity.java,SwaggerAutoConfiguration.java)

代码如下:

@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "swagger")
public class SwaggerConfig {
	
	/** 是否开启 true 开启,false 关闭*/
	private String enabled;
	/** 名称 */
	private String title;
	/** 简介 */
	private String description;
	/** 作者 */
	private String author;
	/** 版本 */
	private String version;
	
	/** headers 公共的默认配置 */
//	private Map<String, String> headers = new HashMap<String, String>();
	
	/** 全局鉴权参数 */
	private List<String> security = new ArrayList<>();
	
	/** 定义分组 */
	private List<SwaggerGroupConfigEntity> groupConfigs = new ArrayList<>();
	
}
/**
 * 配置信息
 * @author LiuGang
 */
@Getter
@Setter
public class SwaggerGroupConfigEntity implements Serializable{
	/**
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * 分组名称
	 */
	private String group;
	
	/**
	 * 获取的接口请求地址
	 */
	private String pathsToMatch;

	/**
	 * 扫描包地址
	 */
	private String packagesToScan;
	
}
/**
 * swggger 接口文档信息
 * @author DEAO-E3 1231
 */
@Configuration
@ConditionalOnProperty(prefix = "swagger", name = "enabled", havingValue = "true", matchIfMissing = true)
public class SwaggerAutoConfiguration  implements BeanFactoryAware {
	
	private static Logger log = LoggerFactory.getLogger(SwaggerAutoConfiguration.class);
	//配置文件
	private SwaggerConfig swaggerConfig;
	private BeanFactory beanFactory;
	private Environment environment;
	
	@Override
    public void setBeanFactory(BeanFactory beanFactory) {
        this.beanFactory = beanFactory;
    }
	@Autowired
	private void swaggerAutoConfiguration(SwaggerConfig config, Environment environment) {
		this.swaggerConfig = config;
		this.environment = environment;
	}
	//这个是自定义分组和返回鉴权策略的he
	@Bean
	public GroupedOpenApi groupedOpenApi() {
		
		log.info("swggger GroupedOpenApi 接口文档信息 + 加载");
		final OperationCustomizer globalHeader = (operation, handlerMethod) -> {
	        operation.addParametersItem(new HeaderParameter()
	            .$ref("#/components/parameters/testheader"));
	        return operation;
	    };
	    ConfigurableBeanFactory configurableBeanFactory = (ConfigurableBeanFactory) beanFactory;
	    
	    if(swaggerConfig == null || swaggerConfig.getGroupConfigs() == null || swaggerConfig.getGroupConfigs().size() == 0) {
	    	GroupedOpenApi api = GroupedOpenApi.builder()
	    	    	.group(environment.getProperty("spring.application.name"))
	    	        .pathsToMatch("/**")
	    	        .addOperationCustomizer(globalHeader)
	    	        .addOpenApiCustomizer(getResponseMessages())
	    	        .build();
	    	return api;
	    } else {
    		List<SwaggerGroupConfigEntity> groupConfigs = swaggerConfig.getGroupConfigs();
    		for(SwaggerGroupConfigEntity entity : groupConfigs) {
    			GroupedOpenApi api = GroupedOpenApi.builder()
	    	    	.group(entity.getGroup())
	    	        .pathsToMatch(entity.getPathsToMatch())
	    	        .packagesToScan(entity.getPackagesToScan())
	    	        .addOperationCustomizer(globalHeader)
	    	        .addOpenApiCustomizer(getResponseMessages())
	    	        .build();
    			//注册成bean
    			configurableBeanFactory.registerSingleton(entity.getGroup(), api);
    		}
	    }
	    return null;
	}
	
	
	@Bean
    public OpenAPI openAPI() {
		log.info("swggger OpenAPI接口文档信息 + 加载");
		OpenAPI openApi  = new OpenAPI();
		//基础参数信息
		openApi.setInfo(getInfo());
		//指定安全模式参数
		securitySchemes(openApi);
		return openApi;
    }
	
	/**
     * 安全模式,这里指定token通过Authorization头请求头传递
     */
    private void securitySchemes(OpenAPI openApi) {
        if(swaggerConfig != null && swaggerConfig.getSecurity() != null && swaggerConfig.getSecurity().size() > 0) {
        	swaggerConfig.getSecurity().forEach(string->{
        		SecurityScheme securityScheme = new SecurityScheme()
    				.name(string)
//    				.scheme("bearer")
    				.bearerFormat("JWT")
    				.type(SecurityScheme.Type.HTTP)
    				.in(SecurityScheme.In.HEADER)
    				.description("安全模式-指定参数:" + string);
        		openApi.schemaRequirement(string, securityScheme)
    			.addSecurityItem(new SecurityRequirement().addList(string));
        	});
        }
    }
	
	private Info getInfo() {
    	if(swaggerConfig == null) {
    		swaggerConfig = new SwaggerConfig();
    	}
    	Contact contact = new Contact()
    			.name(!StringUtils.hasLength(swaggerConfig.getAuthor()) ? "作者" : swaggerConfig.getAuthor());
        Info info = new Info()
	        	.title(!StringUtils.hasLength(swaggerConfig.getTitle()) ? "接口文档" : swaggerConfig.getTitle())
	        	.version(!StringUtils.hasLength(swaggerConfig.getVersion()) ? "接口文档" : swaggerConfig.getVersion())
	            .description(!StringUtils.hasLength(swaggerConfig.getDescription()) ? "更多请咨询服务开发者。" : swaggerConfig.getDescription())
				.contact(contact);
        return info;
    }
	
	/**
	 * 设置全局响应状态
	 * @return
	 */
	private OpenApiCustomizer getResponseMessages() {
	    return openApi -> {
	        openApi.getPaths().values().forEach(pathItem ->
	            pathItem.readOperations().forEach(operation -> {
	            	//返回 响应状态
	                ApiResponses apiResponses = operation.getResponses();
	                
	                String codeString = "其他状态码请参考说明";
	                String msgString = "";
	                
	                for (ResultCode enums : ResultCode.values()) {
	                	if(enums.getCode() != 200) {
	                		msgString += enums.getCode() + "=" + enums.getMsg() + ";";
//	                		apiResponses.addApiResponse(String.valueOf(enums.getCode()),
//	                				new ApiResponse().description(enums.getMsg()));
// 此处是自定义状态码返回,我这里是用自定义枚举 循环返回成一行的,,可以自行转换 和定义多行
	                	}
	                }
	                apiResponses.addApiResponse(codeString,
            				new ApiResponse().description(msgString));
	                
	                //鉴权指定参数 Security
	                if(swaggerConfig != null && swaggerConfig.getSecurity() != null && swaggerConfig.getSecurity().size() > 0) {
	                	List<SecurityRequirement> securityList = new ArrayList<>();
	                	swaggerConfig.getSecurity().forEach(string->{
	                		securityList.add(new SecurityRequirement().addList(string));
	                	});
	                	operation.security(securityList);
	                }
	            }));
	    };
	}
	
	
}

2.配置 yml

代码如下(示例):

#接口文档配置        
swagger:
  enabled: true
  title: 测试接口文档11
  description: 简介信息介绍11
  author: 作者lg
  version: 1.0.1
   #全局鉴权策略参数 
  security:
    - Authorization
    - user-token
  # 定义分组
  groupConfigs:
    - group: 测试的
      pathsToMatch: '/**'
      packagesToScan: com.pub.test.controller
    - group: 测试的22
      pathsToMatch: '/**'
      packagesToScan: com.pub.test.controller
      
springdoc:
  swagger-ui:
    enabled: ${swagger.enabled}
  api-docs:
    #是否开启文档功能
    enabled: ${swagger.enabled}
    #自定义的文档api元数据访问路径。默认访问路径是/v3/api-docs
    path: /v3/api-docs
  #默认平展参数 - 开启query参数实体接口按query传参模式
  default-flat-param-object: true
  #定义分组 -- 建议用 swagger.groupConfigs - 自定义分组,,如果用此处,请将groupedOpenApi() 这个bean删除,将不再支持自定义返回状态和登录策略的header
  #group-configs:
  #  - group: '测试的'
  #    paths-to-match: '/**'
  #    packages-to-scan: com.pub.test.controller
  #  - group: '测试的2'
  #    paths-to-match: '/**'
  #    packages-to-scan: com.pub.test.controller

访问地址:http://127.0.0.1:8082/doc.html
springdoc header,spring boot,ui,后端
springdoc header,spring boot,ui,后端
springdoc header,spring boot,ui,后端
注意事项: 数据返回不响应二级目录文档,解决办法:将顶级对象中的 注解@Schema去掉就行了


总结---->(微服务集成knife4j 请等待更新)

以上就是今天要讲的内容,本文仅仅简单集成了SpringDoc的使用,有不明白的赶紧下方留言。文章来源地址https://www.toymoban.com/news/detail-762661.html

到了这里,关于Spring Boot3.x 使用SpringDoc生成接口文档-超级完善 + knife4jUI的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot 中使用 Poi-tl 渲染数据并生成 Word 文档

    本文 Demo 已收录到 demo-for-all-in-java 项目中,欢迎大家 star 支持!后续将持续更新! 产品经理急冲冲地走了过来。「现在需要将按这些数据生成一个 Word 报告文档,你来安排下」 项目中有这么一个需求,需要将用户填写的数据填充到一个 Word 文档中,而这个 Word 文档是人家给

    2024年02月09日
    浏览(49)
  • Spring Boot3 系列:Spring Boot3 跨域配置 Cors

    CORS,全称是“跨源资源共享”(Cross-Origin Resource Sharing),是一种Web应用程序的安全机制,用于控制不同源的资源之间的交互。 在Web应用程序中,CORS定义了一种机制,通过该机制,浏览器能够限制哪些外部网页可以访问来自不同源的资源。源由协议、域名和端口组成。当一

    2024年01月19日
    浏览(59)
  • Spring Boot3入门

    Git和svn的区别 git常用的命令 git init git clone -b dev git add git commit -m “xxxx” git push git pull git status git branch git checkout -b Git分支的作用 springboot的底层本质还是ssm。只是把一些繁琐的配置文件用配置类代替了,Tomcat内嵌,等先就这么理解。 主要是把ioc和aop之前是在applicationContext

    2024年02月03日
    浏览(35)
  • Spring Boot集成JasperReport生成文档

    由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲染生成PDF文档。 一、使用Ireport designer 5.6设计模板 ireport的使用由于时间关系不便多说,设计好之后,将其进行编译生成jasper文件,然后将

    2024年02月09日
    浏览(41)
  • Spring Boot整合Spring Fox生成Swagger文档

    Springfox是一个用于在Spring应用程序中生成Swagger文档的开源库。它提供了一组注解和工具,可以将你的API代码和文档整合在一起,方便生成和展示API的Swagger文档。 使用Springfox,你可以在Spring Boot项目中集成Swagger,并通过Swagger UI查看和测试API。它提供了一些注解,如 @Api 、 @

    2024年02月08日
    浏览(41)
  • spring boot3参数校验基本用法

    ⛰️个人主页:      蒾酒 🔥系列专栏: 《spring boot实战》 🌊山高路远,行路漫漫,终有归途。 目录 前置条件 前言 导入依赖 使用介绍 配置检验规则 开启校验 使用注意 全局异常捕获返回友好提示信息 常用的校验规则注解 使用技巧 已经初始化好一个spring boot项目且版本为

    2024年02月21日
    浏览(45)
  • Spring Boot入门(23):基于AOP实现自定义注解拦截接口日志并保存入库 | 超级详细,建议收藏

            在上两期中,我们着重介绍了如何集成使用 Logback 与 log4j2 日志框架的使用,今天我们讲解的主题依旧跟日志有关,不过不是使用何种开源框架,而是自己动手造。         Spring的核心之一AOP;AOP翻译过来叫面向切面编程, 核心就是这个切面. 切面表示从业务逻辑中

    2024年02月11日
    浏览(48)
  • Spring Boot3整合MyBatis Plus

    目录 1.前置条件 2.导坐标 3.配置数据源 4.mybatis-plus基础配置 5.配置mapper扫描路径 6.MyBatis Plus代码生成器整合 1.导坐标 2.编写代码生成逻辑 7.整合Druid连接池 已经初始化好一个spring boot项目且版本为3X,项目可正常启动 初始化教程: 新版idea创建spring boot项目-CSDN博客 https://blog

    2024年01月23日
    浏览(49)
  • Spring Boot3整合Druid(监控功能)

    目录 1.前置条件 2.导依赖 错误依赖: 正确依赖: 3.配置 已经初始化好一个spring boot项目且版本为3X,项目可正常启动。 作者版本为3.2.2 初始化教程: 新版idea创建spring boot项目-CSDN博客 https://blog.csdn.net/qq_62262918/article/details/135785412?spm=1001.2014.3001.5501 这个依赖对于spring boot 3的支

    2024年01月22日
    浏览(58)
  • Spring Boot 整合 springdoc-openapi

    springdoc-openapi官网:springdoc.org springdoc-openapi Github仓库:springdoc / springdoc-openapi springdoc-openapi Maven仓库:Home » org.springdoc » springdoc-openapi-ui OpenApi是一个业界的 api 文档标准,一个规范。 好比java里面一个抽象的概念,即是一个抽象类,只是提供了一个api文档规范的抽象方法。

    2024年02月14日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包