使用 Spring Boot 2.4.5 和 IntelliJ 2021.2。迁移后
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
到
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.5.10</version>
</dependency>
每次我访问
http://localhost:8080/swagger-ui.html
。页面上写着:
获取错误未定义/v3/api-docs
当我检查日志时:
java.lang.IllegalStateException:为“/v3/api-docs”映射的处理程序方法不明确:{public org.springframework.http.ResponseEntity springfox.documentation.oas.web.OpenApiControllerWebMvc.getDocumentation(java.lang.String,javax. servlet.http.HttpServletRequest), public java.lang.String org.springdoc.webmvc.api.OpenApiWebMvcResource.openapiJson(javax.servlet.http.HttpServletRequest,java.lang.String) 抛出 com.fasterxml.jackson.core.JsonProcessingException} 在 org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:426) 在org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:377) 在org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:125) 在org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:67) 在 org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:498) 在 org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1257) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
似乎有一个重复的处理程序方法,与 SpringFox 具有相同的路径,我如何从 SpringFox 中删除该方法(它不再存在于我的 pom 文件中)?
删除swagger依赖、springfox依赖。只需添加 openapi 依赖就足够了。
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.6.6</version>
</dependency>
您仍然有这两种依赖关系吗?除了 webflux 之外,我也遇到了同样的问题。经过一番挖掘,我发现了以下内容:
这两个类都为“/v3/api-docs”映射创建处理程序。正如 springdoc 文档所警告的那样,它们是不兼容的:
https://springdoc.org/#differiation-to-springfox-project
11.35。与 Springfox 项目的差异化
- OAS 3 于 2017 年 7 月发布,并且没有发布 springfox 来支持 OAS 3。springfox 目前仅涵盖 swagger 2 与 Spring Boot 的集成。最新发布日期是2018年6月。所以,在维护方面,最近支持非常缺乏。
- ...
- 我们仅依赖 swagger-annotations 和 swagger-ui 官方库。
- ...
11.36。如何使用 springdoc-openapi 迁移到 OpenAPI 3
- springdoc-openapi 和 springfox 之间没有任何关系。如果您想迁移到 OpenAPI 3:
- 删除所有对springfox的依赖和相关代码
- 添加 springdoc-openapi-ui 依赖
- 如果您不想从根路径提供 UI 或者与现有配置有冲突,您只需更改以下属性:
springdoc.swagger-ui.path=/you-path/swagger-ui.html
你可以这样尝试:
springdoc-openapi-ui
+ springfox-swagger2
,而不是springfox-boot-starter
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.5.4</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>3.0.0</version>
</dependency>
这可以通过添加一个新的控制器来解决(我将其命名为
HomeController) with this mapping.
@GetMapping(value = {"/", "/swagger-ui", "/swagger-ui+html"})
public String index() {
return "redirect:/swagger-ui/index.html";
}
我只需将 /v3/api-docs 更改为 /v2/api-docs 即可工作