?目錄
不兼容報錯提醒
1. 修改Spring Boot版本
2. 修改application.yml配置文件
3. 使用其他替代方案
?依賴兼容
配置 Yaml 文件
?依賴報錯提醒
解決方法
1.?選擇一個庫
2.?移除springfox依賴
3.?添加springdoc依賴
4.?配置springdoc
5.?清理項目
6.?啟動項目
示例代碼
application.yml配置
pom.xml依賴
SwaggerConfig配置類(可選)
無法顯示swagger頁面
1.?檢查依賴是否正確加載
2.?檢查Spring Boot的靜態資源路徑
3.?檢查Swagger UI的路徑
4.?檢查是否有其他Spring Security配置
5.?檢查是否有其他Servlet或DispatcherServlet配置
6.?檢查是否有其他靜態資源沖突
7.?檢查是否有其他中間件或代理配置
8.?檢查日志輸出
9.?嘗試訪問其他Swagger UI路徑
10.?檢查是否有其他錯誤
不兼容報錯提醒
org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerExceptionat org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:181) ~[spring-context-5.3.23.jar:5.3.23]at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:54) ~[spring-context-5.3.23.jar:5.3.23]at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:356) ~[spring-context-5.3.23.jar:5.3.23]at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na]at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155) ~[spring-context-5.3.23.jar:5.3.23]at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:123) ~[spring-context-5.3.23.jar:5.3.23]at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:935) ~[spring-context-5.3.23.jar:5.3.23]at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586) ~[spring-context-5.3.23.jar:5.3.23]at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.6.13.jar:2.6.13]at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:745) ~[spring-boot-2.6.13.jar:2.6.13]at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:420) ~[spring-boot-2.6.13.jar:2.6.13]at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) ~[spring-boot-2.6.13.jar:2.6.13]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1317) ~[spring-boot-2.6.13.jar:2.6.13]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.6.13.jar:2.6.13]at com.jkglxt.www.HealthManagementSystemApplication.main(HealthManagementSystemApplication.java:12) ~[classes/:na]
Caused by: java.lang.NullPointerException: nullat springfox.documentation.spring.web.WebMvcPatternsRequestConditionWrapper.getPatterns(WebMvcPatternsRequestConditionWrapper.java:56) ~[springfox-spring-webmvc-3.0.0.jar:3.0.0]at springfox.documentation.RequestHandler.sortedPaths(RequestHandler.java:113) ~[springfox-core-3.0.0.jar:3.0.0]at springfox.documentation.spi.service.contexts.Orderings.lambda$byPatternsCondition$3(Orderings.java:89) ~[springfox-spi-3.0.0.jar:3.0.0]at java.base/java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:469) ~[na:na]at java.base/java.util.TimSort.countRunAndMakeAscending(TimSort.java:355) ~[na:na]at java.base/java.util.TimSort.sort(TimSort.java:234) ~[na:na]at java.base/java.util.Arrays.sort(Arrays.java:1515) ~[na:na]at java.base/java.util.ArrayList.sort(ArrayList.java:1750) ~[na:na]at java.base/java.util.stream.SortedOps$RefSortingSink.end(SortedOps.java:392) ~[na:na]at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258) ~[na:na]at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258) ~[na:na]at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258) ~[na:na]at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258) ~[na:na]at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485) ~[na:na]at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[na:na]at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) ~[na:na]at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) ~[na:na]at springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider.requestHandlers(WebMvcRequestHandlerProvider.java:81) ~[springfox-spring-webmvc-3.0.0.jar:3.0.0]at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) ~[na:na]at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655) ~[na:na]at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[na:na]at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[na:na]at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) ~[na:na]at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) ~[na:na]at springfox.documentation.spring.web.plugins.AbstractDocumentationPluginsBootstrapper.withDefaults(AbstractDocumentationPluginsBootstrapper.java:107) ~[springfox-spring-web-3.0.0.jar:3.0.0]at springfox.documentation.spring.web.plugins.AbstractDocumentationPluginsBootstrapper.buildContext(AbstractDocumentationPluginsBootstrapper.java:91) ~[springfox-spring-web-3.0.0.jar:3.0.0]at springfox.documentation.spring.web.plugins.AbstractDocumentationPluginsBootstrapper.bootstrapDocumentationPlugins(AbstractDocumentationPluginsBootstrapper.java:82) ~[springfox-spring-web-3.0.0.jar:3.0.0]at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.start(DocumentationPluginsBootstrapper.java:100) ~[springfox-spring-web-3.0.0.jar:3.0.0]at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178) ~[spring-context-5.3.23.jar:5.3.23]... 14 common frames omitted
你遇到的Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException
錯誤,通常是由于Spring Boot版本與Swagger版本不兼容導致的。以下是一些解決方案:
1. 修改Spring Boot版本
降低你的Spring Boot版本到2.5及以下,就不再會出現上述的問題。
2. 修改application.yml
配置文件
在application.yml
文件中添加以下配置,以解決Spring Boot 2.6.x版本與Swagger 3.0.0的兼容性問題:
spring:mvc:pathmatch:matching-strategy: ant_path_matcher
如果使用的是application.properties
文件,則添加以下配置:
spring.mvc.pathmatch.matching-strategy=ant_path_matcher
3. 使用其他替代方案
可以考慮使用springdoc-openapi-ui
作為替代方案。它是一個基于Spring Boot的OpenAPI實現,與Spring Boot 2.6.x和3.x版本兼容性較好。在pom.xml
中添加以下依賴:
?依賴兼容
依賴二選一即可
<!-- 生成接口文檔-->
<!-- <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.6.11</version></dependency><dependency>
?
配置 Yaml 文件
springdoc:swagger-ui:path: /swagger-ui.html
spring:mvc:static-path-pattern: /**pathmatch:matching-strategy: ant_path_matcher
?依賴報錯提醒
java.lang.IllegalStateException: Ambiguous handler methods mapped for '/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,java.util.Locale) throws com.fasterxml.jackson.core.JsonProcessingException}at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:432) ~[spring-webmvc-5.3.23.jar:5.3.23]at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:383) ~[spring-webmvc-5.3.23.jar:5.3.23]at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:125) ~[spring-webmvc-5.3.23.jar:5.3.23]at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:67) ~[spring-webmvc-5.3.23.jar:5.3.23]at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:498) ~[spring-webmvc-5.3.23.jar:5.3.23]at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1265) ~[spring-webmvc-5.3.23.jar:5.3.23]at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1047) ~[spring-webmvc-5.3.23.jar:5.3.23]at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964) ~[spring-webmvc-5.3.23.jar:5.3.23]at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.23.jar:5.3.23]at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.23.jar:5.3.23]at javax.servlet.http.HttpServlet.service(HttpServlet.java:670) ~[tomcat-embed-core-9.0.68.jar:4.0.FR]at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.23.jar:5.3.23]at javax.servlet.http.HttpServlet.service(HttpServlet.java:779) ~[tomcat-embed-core-9.0.68.jar:4.0.FR]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.68.jar:9.0.68]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.23.jar:5.3.23]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.23.jar:5.3.23]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.23.jar:5.3.23]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.23.jar:5.3.23]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.23.jar:5.3.23]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.23.jar:5.3.23]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.68.jar:9.0.68]at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
這個錯誤表明在你的Spring Boot項目中,/v3/api-docs
路徑被多個處理器方法映射,導致了沖突。這通常是由于同時引入了 springfox
和 springdoc
兩個庫,它們都試圖處理這個路徑,從而導致了沖突。
解決方法
1.?選擇一個庫
建議選擇一個庫來生成API文檔。springdoc
是目前更推薦的庫,因為它與Spring Boot 2.6.x和3.x版本的兼容性更好。
2.?移除springfox
依賴
<dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version>
</dependency>
3.?添加springdoc
依賴
在pom.xml
中添加springdoc
的依賴:
<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-ui</artifactId><version>1.6.11</version>
</dependency>
4.?配置springdoc
在application.yml
或application.properties
中添加以下配置,以解決Spring Boot 2.6.x版本與springdoc
的兼容性問題:
spring:mvc:pathmatch:matching-strategy: ant_path_matcher
或者在application.properties
中:
spring.mvc.pathmatch.matching-strategy=ant_path_matcher
5.?清理項目
清理并重新構建項目,以確保所有依賴都正確加載:
mvn clean install
6.?啟動項目
啟動項目后,訪問 http://localhost:8080/swagger-ui/index.html
,你應該能夠看到Swagger UI界面。
示例代碼
application.yml
配置
spring:mvc:pathmatch:matching-strategy: ant_path_matcher
pom.xml
依賴
<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-ui</artifactId><version>1.6.11</version>
</dependency>
SwaggerConfig
配置類(可選)
如果你需要自定義Swagger文檔的標題、描述等信息,可以創建一個配置類:
import org.springdoc.core.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class SwaggerConfig {@Beanpublic GroupedOpenApi publicApi() {return GroupedOpenApi.builder().group("public").pathsToMatch("/api/**").build();}
}
無法顯示swagger頁面
如果在訪問 http://localhost:8080/swagger-ui/index.html
時沒有看到Swagger UI界面
1.?檢查依賴是否正確加載
確保springdoc-openapi-ui
依賴已經正確添加到pom.xml
中,并且沒有沖突的依賴。例如:
<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-ui</artifactId><version>1.6.11</version>
</dependency>
運行以下命令來清理并重新構建項目:
mvn clean install
2.?檢查Spring Boot的靜態資源路徑
默認情況下,Spring Boot會將/swagger-ui/index.html
映射到Swagger UI的靜態資源路徑。確保你的Spring Boot應用沒有覆蓋默認的靜態資源路徑。
在application.properties
或application.yml
中,確保沒有覆蓋spring.mvc.static-path-pattern
屬性。如果有,可以嘗試將其設置為默認值:
spring.mvc.static-path-pattern=/**
3.?檢查Swagger UI的路徑
默認情況下,Swagger UI的路徑是/swagger-ui/index.html
。如果你使用的是springdoc
,可以通過以下配置自定義路徑:
springdoc.swagger-ui.path=/swagger-ui.html
然后訪問http://localhost:8080/swagger-ui.html
。
4.?檢查是否有其他Spring Security配置
如果你的項目中使用了Spring Security,可能需要為Swagger UI的路徑添加訪問權限。例如:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/swagger-ui/**", "/v3/api-docs/**").permitAll() // 允許訪問Swagger UI和API文檔.anyRequest().authenticated().and().formLogin().permitAll().and().logout().permitAll();}
}
5.?檢查是否有其他Servlet或DispatcherServlet配置
如果你的項目中自定義了Servlet
或DispatcherServlet
,可能會影響Swagger UI的路徑映射。確保沒有其他配置覆蓋了Swagger UI的默認路徑。
6.?檢查是否有其他靜態資源沖突
如果你的項目中自定義了靜態資源路徑,可能會與Swagger UI的路徑沖突。確保沒有其他靜態資源覆蓋了/swagger-ui/index.html
路徑。
7.?檢查是否有其他中間件或代理配置
如果你的項目部署在某個中間件或代理服務器后面,可能需要確保中間件或代理服務器正確轉發了/swagger-ui/index.html
路徑。
8.?檢查日志輸出
啟動項目時,查看日志輸出,確認Swagger UI的靜態資源是否被正確加載。例如,你可能會看到類似以下的日志:
Mapped URL path [/swagger-ui/index.html] onto handler of type [class org.springdoc.webmvc.ui.SwaggerIndexTransformer]
如果沒有看到類似的日志,可能表示Swagger UI的靜態資源沒有被正確加載。
9.?嘗試訪問其他Swagger UI路徑
除了/swagger-ui/index.html
,還可以嘗試訪問以下路徑:
-
http://localhost:8080/swagger-ui.html
-
http://localhost:8080/v3/api-docs
如果能夠訪問到/v3/api-docs
,說明Swagger的API文檔已經生成,但Swagger UI可能沒有正確加載。
10.?檢查是否有其他錯誤
查看項目啟動時的完整日志,確認是否有其他錯誤導致Swagger UI無法加載。例如,可能存在某些依賴沖突或配置錯誤。
- Thank you -