【Java】 Swagger 自定义输出文档
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 对象时使用。
具体切面代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | @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); } } |
分类:
Java小记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本