按参数或标签或任何不同的键对 API 进行分组

Group APIs by parameter or tag or any different key

我有四种API需要分组:

profileOne = 路径:v1/profileOne/

profileTwo = 路径:v1/profileTwo/

common = 路径:v1/common(两个配置文件都可以访问)

但我也有一些 API 例如:

v1/testv1/hello 属于 profileOne 但路径不同。

我可以将 v1/profileOnev1/testv1/hello 分组的唯一方法是按路径还是按包?

    private static final String[] PROFILE_ONE_PATHS = { "/v1/profileOne/**", "/v1/test/**", "/v1/hello/**" };

    @Bean
    public GroupedOpenApi profileOneApi(OpenApiCustomiser springCloudContractCustomizer) {
        return GroupedOpenApi.builder().group("profileOne").pathsToMatch(PROFILE_ONE_PATHS)
                .addOpenApiCustomiser(springCloudContractCustomizer).build();
    }

我想在我的 RestController 中添加任何键或 属性 并按它分组,有什么办法吗?

我担心的是每次添加 profileOne 的新端点时我都必须更改配置 class。

我现在有 headers、消费和生产选项,但记住我有共同的 API,我需要排除 v1/testv1/hellov1/profileOne.

我想这已经有人回答了 here:

  • 在您的操作级别使用正确的组名称或在 @Operation 级别定义一个 @Tag
    • 如果您不想使用标签,那么您还有其他 @Operation 属性,您可以在其中添加您的关键字以在您的案例的部分摘要、描述或任何其他相关字段中进行搜索。
  • 然后通过OpenApiCustomiser
  • 过滤

这只是一个带有标签的示例,您可以对其进行调整。

@RestController
public class HelloController {

    @GetMapping(value = "/sample1")
    @Tag(name = "profileOne")
    public void sample1(String toto) {
    }

    @GetMapping(value = "/sample2")
    @Tag(name = "profileTwo")
    public void sample2(String toto) {
    }

    @Bean
    public GroupedOpenApi groupProfileOne() {
        return GroupedOpenApi.builder()
                .addOpenApiCustomiser(openApiCustomiserProfileOne())
                .group("profileOne")
                .packagesToScan("demo")
                .build();
    }

    @Bean
    public GroupedOpenApi groupProfileTwo() {
        return GroupedOpenApi.builder()
                .addOpenApiCustomiser(openApiCustomiserProfileTwo())
                .group("profileTwo")
                .packagesToScan("demo")
                .build();
    }

    private OpenApiCustomiser openApiCustomiserProfileTwo() {
        return openApi -> openApi.getPaths().entrySet()
                .removeIf(path -> path.getValue().readOperations().stream()
                    .anyMatch(operation -> operation.getTags().contains("profileOne")));
    }

    private OpenApiCustomiser openApiCustomiserProfileOne() {
        return openApi -> openApi.getPaths().entrySet()
                .removeIf(path -> path.getValue().readOperations().stream()
                    .anyMatch(operation -> operation.getTags().contains("profileTwo")));
    }
}