按参数或标签或任何不同的键对 API 进行分组
Group APIs by parameter or tag or any different key
我有四种API需要分组:
profileOne = 路径:v1/profileOne/
profileTwo = 路径:v1/profileTwo/
common = 路径:v1/common
(两个配置文件都可以访问)
但我也有一些 API 例如:
v1/test
和 v1/hello
属于 profileOne
但路径不同。
我可以将 v1/profileOne
和 v1/test
和 v1/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/test
和 v1/hello
和 v1/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")));
}
}
我有四种API需要分组:
profileOne = 路径:v1/profileOne/
profileTwo = 路径:v1/profileTwo/
common = 路径:v1/common
(两个配置文件都可以访问)
但我也有一些 API 例如:
v1/test
和 v1/hello
属于 profileOne
但路径不同。
我可以将 v1/profileOne
和 v1/test
和 v1/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/test
和 v1/hello
和 v1/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")));
}
}