如何通过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
相关产品推荐
相关产品推荐

