首页 > 其他分享 >Swagger 自定义输出文档

Swagger 自定义输出文档

时间:2023-06-08 10:47:48浏览次数:40  
标签:Swagger 自定义 args Object 文档 joinPoint swagger swaggerObject

  Swagger 作为 Java 开发中常用的接口文档生成组件,绝大部分情况下都可以满足我们的业务需求。但有些时候依然有些不足,比如针对系统中某些特殊接口需要作出一些增强。

  我自己在使用 Swagger 时候遇到需要将 base_path 消除并直接拼接到接口路径上的情形。一共寻找到两种方式:

    1. 重写 Swagger2Controller ,并将转发到 tomcat 容器中的请求转发至重写后的 Swagger2Controller 中。

    2. 使用切面,将即将序列化的 swagger 对象做定制化更改增强。

  第一个方案卡在请求转发到重写后的控制器。应用的 Web 容器与 Swagger 的 Web容器并不相通,试了很久也没有实现。最终决定更换赛道,采用第二种方案。

  第二种方案可以指定切入点为 springfox.documentation.spring.web.json.JsonSerializer.toJson ,此方法在 “ /v2/api-docs ” 路径响应完毕并将 Swagger 对象转为 Json 对象时使用。

  具体切面代码如下:

@Aspect
@Component
@AllArgsConstructor
public class SwaggerAspect {
	@Around("execution(* springfox.documentation.spring.web.json.JsonSerializer.toJson(..))")
	public Object switchDataSource(ProceedingJoinPoint joinPoint) throws Throwable {
		Object[] args = joinPoint.getArgs();
		if (ArrayUtils.isEmpty(args)) {
			return joinPoint.proceed(args);
		}
		Object swaggerObject = args[0];
		if(swaggerObject instanceof Swagger){
			Swagger swagger = (Swagger) swaggerObject;
			String basePath = swagger.getBasePath();
			swagger.setBasePath("/");
			Map<String, Path> paths = swagger.getPaths();
			Map<String, Path> newPaths = new HashMap<>();
			for (Map.Entry<String, Path> entry : paths.entrySet()) {
				String newPath = basePath + entry.getKey();
				newPaths.put(newPath, entry.getValue());
			}
			swagger.setPaths(newPaths);
		}
		args[0] = swaggerObject;
		return joinPoint.proceed(args);
	}
}

  

标签:Swagger,自定义,args,Object,文档,joinPoint,swagger,swaggerObject
From: https://www.cnblogs.com/southtwilight/p/17465475.html

相关文章

  • python 解析HTML和XML文档
    一、BeautifulSoupBeautifulSoup是一个Python包,用于解析HTML和XML文档。它可以快速而方便地从网页中提取信息,并以易于使用的方式对其进行处理。它支持各种解析器,包括内置的Python解析器和第三方解析器,例如lxml和html5lib。二、对标签提取代码示列以下是使用BeautifulSoup解析H......
  • 想要提高办公效率,可以采用表单自定义工具
    当前,随着社会的进步和科技的发展,表单自定义工具逐渐在现代化办公场所中得到重用和喜爱。因为它的灵活、简便、易操作等优势特性,使得其突破了传统表单制作工具的局限,成为广大中大型企业实现流程化管理和数字化进程的得力助手。如果您也想打破传统表单限制,实现提质增效的办公目的,不......
  • python读txt文档-多列
    有一个txt格式的文本文档,格式如下。有两行数据。3个字段,字段与字段直接使用tab键分割开。hello1world1hellothankyou1hello2world2hellothankyou2现在想通过python读取这个文件。分别读取到hello1,world1,和 hellothankyou1代码如下。withopen('......
  • JAVA的springboot+vue企业客户信息反馈平台,附源码+数据库+文档+PPT
    1、项目介绍企业客户信息反馈平台能够通过互联网得到广泛的、全面的宣传,让尽可能多的用户了解和熟知企业客户信息反馈平台的便捷高效,不仅为客户提供了服务,而且也推广了自己,让更多的客户了解自己。对于企业客户信息反馈而言,若拥有自己的平台,通过平台得到更好的管理,同时提升了形象......
  • Shiro自定义异常无法被捕获总是抛出AuthenticationException解决方案
    问题描述配置Realm之后,发现在Realm中抛出的异常被无法捕获,最后抛出AuthenticationException异场景再现 下面是errorlog2023-06-0711:49:26.131[TID:N/A][][http-nio-9]ERRORo.s.c.sleuth.instrument.web.ExceptionLoggingFilter:54-Uncaughtexceptionthrow......
  • 使用 Dockerfile 自定义 Docker 镜像
    对于一些常用的Docker镜像,我们可以从Docker官方仓库或者国内的阿里云仓库中获取,比如mysql、redis、nginx等等。但是对于一些我们自己开发的程序,要想很方便的在Docker中部署,还是需要自己制作镜像。这里不介绍Docker常用命令的使用,网上学习资料很多,这里就直接进行演示。......
  • 自定义缓存注解
    自定义Springboot缓存注解在使用redis缓存时,我们可能使用Jedis,RedisTemplate或者使用@Cacheable注解。尽管这些方法都能够实现缓存的功能,但是有时在真实的业务当中这些方法可能还不够简洁和灵活,于是我们可以自定义缓存注解来解决问题。SpringBoot中注解的格式......
  • vue 预览word文档、图片、pdf文件等
    <el-buttonsize="mini"type="text"icon="el-icon-edit"@click="handlePreviewFile(obj)">预览</el-button><el-dialogtitle="预览":visible.sync="......
  • vue3实现自定义指令
    创建一个empty.jsimport{nextTick}from'vue';constemptyImgUrl=newURL('@/assets/images/empty-icon.jpeg',import.meta.url).href;//在vue3中不支持require引入静态图片,这是一种引入方式另外一种是直接importconstempty={install(app,options){app......
  • 运维人员福音!自定义插件为运维提供更多可能
    想要轻松应对业务问题吗?想要想迪哥一样不再焦虑吗?想要实现指标监控自主性吗?倾情推荐嘉为蓝鲸一体化运维平台WeOps让监测更加随心应手只要能用工具解决的问题WeOps都能解决支持跨云跨管理,低负载采用Agent-Proxy-Server模式,轻松实现企业跨云跨网络的管理诉求。Agent启动内存仅需20M,资......