【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);
    }
}

  

posted @   南国微光  阅读(327)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示