You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Docket配置隐藏带有@Deprecated标记的API/Controller(Swagger生成场景)

全局控制Swagger中废弃API的显示状态

当然有更高效的解决方案!你完全不用逐个给接口加@Operation(hidden=true),通过Docket的全局配置就能批量处理废弃API,还能轻松切换显示/隐藏状态,下面给你两种实用方案:

方案一:针对@Operation(deprecated=true)的过滤

这个方案适配你示例中用@Operation(deprecated=true)标记的废弃接口,通过自定义筛选逻辑实现全局控制:

首先定义一个开关变量(可以放到配置文件里实现动态切换):

// 配置类中定义,true=显示废弃接口,false=隐藏
private boolean showDeprecatedEndpoints = false;

然后修改你的Docket配置,加入核心过滤逻辑:

@Bean
public Docket orderApi() {
    return new Docket(DocumentationType.SWAGGER_2)
            .groupName("order")
            .apiInfo(metadata())
            .select()
            .paths(PathSelectors.ant("/order/**"))
            // 核心:控制废弃接口的显示
            .apis(input -> {
                // 获取当前接口方法上的@Operation注解
                Optional<Operation> operationAnn = Arrays.stream(input.getHandlerMethod().getMethodAnnotations())
                        .filter(ann -> ann instanceof Operation)
                        .map(ann -> (Operation) ann)
                        .findFirst();
                
                // 逻辑:开关打开 或 接口未标记为废弃,就保留该接口
                return showDeprecatedEndpoints || operationAnn.isEmpty() || !operationAnn.get().deprecated();
            })
            .build();
}

之后只要修改showDeprecatedEndpoints的值,就能一键切换所有标记了deprecated=true的接口的显示状态,完全不用改动业务代码里的注解。

方案二:兼容JDK原生@Deprecated注解的过滤

如果你同时有用JDK原生@Deprecated标记废弃方法,也可以用类似逻辑处理:

@Bean
public Docket orderApi() {
    return new Docket(DocumentationType.SWAGGER_2)
            .groupName("order")
            .apiInfo(metadata())
            .select()
            .paths(PathSelectors.ant("/order/**"))
            .apis(input -> {
                HandlerMethod handlerMethod = input.getHandlerMethod();
                // 检查方法或类上是否存在@Deprecated注解
                boolean isDeprecated = handlerMethod.hasMethodAnnotation(Deprecated.class)
                        || handlerMethod.getBeanType().isAnnotationPresent(Deprecated.class);
                
                // 开关控制显示逻辑
                return showDeprecatedEndpoints || !isDeprecated;
            })
            .build();
}

进阶:把开关放到配置文件(更灵活)

如果你想不用修改代码就能切换状态,可以把开关变量放到配置文件中:

# application.properties
swagger.show-deprecated-endpoints=false

然后在配置类中注入这个值:

@Value("${swagger.show-deprecated-endpoints:false}")
private boolean showDeprecatedEndpoints;

这样只要修改配置文件就能快速切换废弃接口的显示状态,非常便捷。


内容的提问来源于stack exchange,提问作者Bravo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 02:38:13