Swagger是目前最受欢迎的REST APIs文档生成工具,同时也是API的在线测试工具。功能强大谁用谁知道。我就不用在这里推广它了。今天要解决的问题是:如果让一些特定的API接口在Swagger中不显示,即从Swagger中过滤掉一些不想展示的接口?
通常我们使用Swagger都是通过指定要扫描的包或者扫描具有某些注解的Controller,来生成API,那么如果这其中还想过滤掉一些特定API怎么做呢?可以在构建Docket的时候,在apis()方法中传入Predicate<RequestHandler>实例,来进行更加精细的过滤。
1、先看下Docket的定义,这里在apis方法中,传入Predicate<RequestHandler>列表
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@Bean public Docket getBusinessApiInfo() { return new Docket(DocumentationType.SWAGGER_2) .globalOperationParameters(setParams()) .groupName("Default Api") .select() // 在这里我们代用一个私有方法apis(),传入Predicate<RequestHandler>列表 .apis(Predicates.or(apis())) .paths(PathSelectors.any()) .build() .apiInfo(businessApiInfo()); } |
2、接下来是私有方法apis()的定义,使用Predicate<RequestHandler>可以拿到一个类型为RequestHandler参数,从RequestHandler中可以拿到一个API的详细信息,包括方法、注解,路径等信息,根据这些条件来判断是否需要过滤掉。
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 |
/** * 根据basePackage指定多个要扫描的包,然后再过滤掉一些特定的api * @return */ private List<Predicate<RequestHandler>> apis() { List<Predicate<RequestHandler>> apis = new ArrayList<>(); if (null != basePackages) { for (String basePackage : basePackages) { Predicate<RequestHandler> predicate = input -> { // basePackage包验证 boolean basePackageIsOk = declaringClass(input).transform(handlerPackage(basePackage)).or(true); // 过滤掉特定的API boolean filterIsOk = true; try { SwaggerApiFilter swaggerApiFilter = SpringContextHolder.getBean(SwaggerApiFilter.class); filterIsOk = swaggerApiFilter == null ? true : swaggerApiFilter.apply(input); } catch (Exception e){ log.error("execute SwaggerApiFilter error: {}", e.getMessage()); } return basePackageIsOk && filterIsOk; }; apis.add(predicate); } } return apis; } |
3、SwaggerApiFilter是我定义的一个接口,用来编写具体的过滤方式。下面看一个该接口的具体实现类:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class MySwaggerApiFilter implements SwaggerApiFilter { @Override public boolean apply(RequestHandler input) { if (input instanceof WebMvcRequestHandler) { WebMvcRequestHandler handler = (WebMvcRequestHandler)input; HandlerMethod handlerMethod = handler.getHandlerMethod(); // 已经拿到Handler和HandlerMethod了,尽情根据实际情况过滤吧。 // 返回false表示不通过,返回true表示通过 } return true; } } |
通过这种方式就可以过滤掉一些特定的API,不在Swagger的页面上展示了。
文章评论