OpenAPI 和 spring-doc 未找到控制器类中的所有映射

Hal*_*lex 3 swagger spring-boot openapi springdoc springdoc-openapi-ui

这有点奇怪。springdoc-openapi-ui v1.2.32,生成的文档仅包含控制器内的一些映射。

例子:

    @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){ ... }
Run Code Online (Sandbox Code Playgroud)

postBar仅针对和服务生成文档getBar,其他路径将被忽略。

我尝试过的:

  1. 最初这两个 POST 方法都被命名为post. 我重命名是为了避免冲突。
  2. 我没有设置控制器级别路径。
  3. 检查注释导入
  4. 未命中文档的缓存版本

如果我向控制器添加另一个服务(带或不带注释标记),它也不会显示在生成的 Swagger 中。例如:

@GetMapping(path="/test")
public String getTest(){
    return "test";
}
Run Code Online (Sandbox Code Playgroud)

如果我将此方法添加到全新的控制器中,则会生成文档。

谢谢

编辑 配置类

@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")));
    }
    
}
Run Code Online (Sandbox Code Playgroud)

Deb*_*Roy 9

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

springdoc.paths-to-match=/api/v1,/v2,/v3,/status
Run Code Online (Sandbox Code Playgroud)

上述属性匹配以, , ,开头和结尾的端点。这无法匹配可能具有类似或什至等形式的端点。/v2/v3/status/api/v1/users/v2//v2/users

虽然不支持完整的正则表达式来指定您想要包含的端点,但是对此的基本支持**可以帮助您指定想要包含/排除的级别。

考虑下面的例子

springdoc.paths-to-match=/**/v1/**/
Run Code Online (Sandbox Code Playgroud)

它将包括/v1/其中包含的任何端点。例子如/users/v1//v1/dasboard以及/user/v1/dashboard

springdoc.paths-to-match=/v2/**
Run Code Online (Sandbox Code Playgroud)

它将仅匹配从 n 层开始/v2并深入 n 层的端点。像这样的例子/v2/dashboard将被包括在内,但/users/v2/something将被排除在外。

springdoc.paths-to-match=/**/v1
Run Code Online (Sandbox Code Playgroud)

它只会匹配以 结尾的路径/v1。like 的示例/users/v1将被匹配,而 like 的示例/v1/user将不被匹配。

或者,您也可以更新您的Bean以执行相同的操作。但请注意,属性文件优先于 bean 配置。

springdoc.paths-to-match=/api/v1,/v2,/v3,/status
Run Code Online (Sandbox Code Playgroud)