Spring Boot中如何通过Swagger在OpenApi中排除Repository端点
解决方案:在OpenApiConfig中过滤Repository端点
你可以通过添加OpenApiCustomiser或者GroupedOpenApi来过滤掉Spring Data REST生成的Repository端点,无需在Repository类上添加@Hidden注解。以下是两种可行的实现方式:
方式一:通过Tag标识精准过滤
Spring Data REST生成的接口默认会带上Spring Data REST标签,我们可以基于这个标签移除所有相关操作:
@Configuration class OpenApiConfig { @Value("${application.title}") private String title; @Value("${application.licenseName}") private String licenseName; @Bean public OpenAPI customOpenAPI(@Value("${application.description}") String description, @Value("${application.version}") String version) { return new OpenAPI() .info(new Info().title(title) .version(version) .description(description) .license(new License().name(licenseName))); } // 添加过滤器移除Spring Data REST相关接口 @Bean public OpenApiCustomiser excludeSpringDataRestEndpoints() { return openApi -> openApi.getPaths().values().removeIf(pathItem -> pathItem.readOperations().stream() .anyMatch(operation -> operation.getTags().contains("Spring Data REST")) ); } }
方式二:通过路径前缀直接排除
如果你的Repository端点有统一的路径前缀(比如默认的/api/**),可以直接通过路径规则排除:
@Configuration class OpenApiConfig { @Value("${application.title}") private String title; @Value("${application.licenseName}") private String licenseName; @Bean public OpenAPI customOpenAPI(@Value("${application.description}") String description, @Value("${application.version}") String version) { return new OpenAPI() .info(new Info().title(title) .version(version) .description(description) .license(new License().name(licenseName))); } // 配置分组API,排除指定路径下的Repository端点 @Bean public GroupedOpenApi publicApi() { return GroupedOpenApi.builder() .group("public-api") .pathsToMatch("/**") .pathsToExclude("/api/**") // 替换为你的Repository实际路径前缀 .build(); } }
说明
- 方式一精准性更高,不会误过滤其他业务接口,适合不确定Repository路径前缀的场景;
- 方式二更简洁直接,适合Repository路径有统一规则的场景,需根据实际配置调整
pathsToExclude的值; - 两种方案都无需修改任何Repository类,完全在OpenApiConfig中完成配置。
内容的提问来源于stack exchange,提问作者Sercan Noyan Germiyanoğlu
相关产品推荐
相关产品推荐

