swagger OpenAPI & spring-doc未在控制器类中找到所有Map

vh0rcniy  于 2022-11-06  发布在  Spring
关注(0)|答案(2)|浏览(247)

这有点奇怪。springdoc-openapi-ui v1.2.32中,生成的文档只包含控制器中的一些Map。
示例:

@Operation(
            summary = "Foo",
            description = "Foo"
    )
    @PostMapping(path="/v1/foo")
    public ResponseEntity<ResponseObject> postFoo(@RequestBody FooRequestObject searchRequest, HttpServletRequest request){ ... }

    @Operation(
            summary = "Bar",
            description = "Bar"
    )
    @GetMapping(path="/v1")
    public ResponseEntity<ResponseObject> getBar(@RequestBody BarRequestObject request, HttpServletRequest request){ ... }

    @Operation(
            summary = "Bar",
            description = "Bar"
    )
    @PostMapping(path="/v1")
    public ResponseEntity<ResponseObject> postBar(@RequestBody BarRequestObject request, HttpServletRequest request){ ... }

只为postBargetBar服务生成单据,其他路径忽略。
我尝试过的方法:
1.最初两个POST方法都被命名为post。我重命名以避免冲突。
1.我没有设置控制器级别的路径。
1.已检查注解导入
1.未命中文档的缓存版本
如果我向控制器添加另一个服务(带或不带注解标记),它也不会显示在生成的Swagger中。

@GetMapping(path="/test")
public String getTest(){
    return "test";
}

如果我将此方法添加到一个全新的控制器中,则会生成doc。
谢谢

编辑配置类

@Configuration
public class SwaggerConfig {                                    

    @Bean
    public OpenAPI springOpenAPI() {
        return new OpenAPI()
                .info(new Info().title("My API")
                .description("My API service documentation. ")
                .version("v1.0")
                .license(new License().name("Terms of Use").url("https://myapi.com/terms.html")));
    }

}
oxosxuxt

oxosxuxt1#

您所面临的问题是由于您对paths-to-match使用了1级引用,这导致Springdoc过滤了在指定路径上可用的端点。

springdoc.paths-to-match=/api/v1,/v2,/v3,/status

上述属性匹配/v2/v3/status/api/v1开始和结束的端点。但无法匹配可能具有/users/v2/甚至/v2/users等形式的端点。
虽然不支持完整的正则表达式来指定您希望包含的端点,但有对**的基本支持,可以帮助您指定您希望包含/排除的级别。
请考虑以下示例

springdoc.paths-to-match=/**/v1/**/

它将包括任何包含/v1/的端点。例如/users/v1//v1/dasboard/user/v1/dashboard

springdoc.paths-to-match=/v2/**

它将只匹配从/v2开始到n级深度的端点。例如/v2/dashboard将被包括,但/users/v2/something将被排除。

springdoc.paths-to-match=/**/v1

它只匹配以/v1结尾的路径。例如,/users/v1将被匹配,而/v1/user将不被匹配。
或者,您也可以更新您的Bean来做同样的事情。但是请注意,属性文件优先于bean config。

// you existing bean here

// Define an API group that'll include specific version. Can be helpful in versioning the APIs.
@Bean
public GroupedOpenApi hideApis() {
    return GroupedOpenApi.builder().group("default")
            .pathsToExclude("/api/v2/**", "/v2/**", "/**/v3/**")
            .pathsToMatch("/v1/**", "/api/v1/**")
            .build();
}
wh6knrhe

wh6knrhe2#

在我的案例中,OpenApi配置中排除了它

@Bean
public GroupedOpenApi api() {
    return GroupedOpenApi.builder()
            .group("REST API")
            .pathsToMatch("/api/**", "/token")  <-- need to be added here
            .build();
}

相关问题