spring-boot - 从 SpringFox 迁移到 SpringDoc 后得到“为 '/v3/api-docs' 映射的模糊处理程序方法”
问题描述
使用 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),公共 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.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)getHandlerInternal(RequestMappingInfoHandlerMapping.java:67) at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:498) at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1257) at 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)getHandlerInternal(RequestMappingInfoHandlerMapping.java:67) at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:498) at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1257) at 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)getHandler(DispatcherServlet.java:1257) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) at org.springframework .web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)getHandler(DispatcherServlet.java:1257) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) at org.springframework .web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
似乎有一个与 SpringFox 具有相同路径的重复处理程序方法,我将如何从 SpringFox 中删除该方法(它不再存在于我的 pom 文件中)?
解决方案
你还有这两个依赖吗?我有同样的问题,除了 webflux。经过一番挖掘,我发现了以下内容:
- springdoc-openapi-webflux-core-1.5.10:OpenAPIWebfluxResource.class
- springfox-oas-3.0.0:OpenAPIControllerWebFlux.class
这两个类都为“/v3/api-docs”映射创建处理程序。正如 springdoc 文档所警告的那样,它们是不兼容的:
https://springdoc.org/#differentiation-to-springfox-project
11.35。与 Springfox 项目的差异化
- OAS 3 于 2017 年 7 月发布,并且没有发布 springfox 来支持 OAS 3。springfox 暂时只涵盖了与 Spring Boot 的 swagger 2 集成。最新发布日期是 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
推荐阅读
- swiftui - 在 SwiftUI 中为 UITextView 设置初始视图偏移量
- javascript - 如何将列表映射到一定数量的数据
- java - 无法在空对象上调用方法 head()
- r - 如何在 pheatmap 中按行绘制值?
- javascript - 如何编辑模态图像(灯箱)以完全响应
- scala - 如何将返回的查询结果从 Salesforce SOAP API 转换为 Spark Dataframe
- python - 类内的函数未执行
- javascript - 有没有办法检查用户访问的下一个 URL?
- python - Geopandas:如何绘制国家/城市?
- python-3.x - 修剪或剥离行尾或行首字符 Python