前一篇发了 springboot 启动 Check your application‘s dependencies for a supported reactive web server-CSDN博客
虽然是解决了,但还是要一探究竟
原因:
在我的项目里引用了pom.xml 引入了 spring.boot.parent 此时如果直接写@SpringBootApplication 其实是会找不到,编译都不会过.
但我在依赖里引入了
<dependency><groupId>io.github.pig-mesh.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId><version>1.2.1</version>
</dependency>
就是这个,让我误认会我已经加载了正常的springboot web项目了;但为什么会报 reactive的错误 了,正常应该会报web servlet的错才对;
看了一下源码,springappliction run 的时候,会去判断一个
org.springframework.web.reactive.DispatcherHandler 如果存在这个项目就以REACTIVE 非阻塞运行.(了解了一下,这个其实是 springboot2.X 推的一个反堆栈的模块即 springboot-webflux)
但我都没有加载其他的东西,理论上不该报reactive,于是我查看了jar的依赖引用关系,果不其然。
spring-ai-openai...这个包里,依赖了 springboot.web 和 webflux两个都依赖了,所以项目加载里,会找到webflux的Handler
但我的项目里又没有加载 springboot-starter-webflux包,所以根据找不到Nettery相关的容器去创建服务,此时就报错了.
那么又有一个新问题,即然寻找的是 reactive,为什么我加了springboot-starter-web包,又能成功了?
原因是:在springappliction启动的时候,如果找到了
org.springframework.web.reactive.DispatcherHandler 找到了,并且还要排除掉是否有 org.springframework.web.servlet.DispatcherServlet 类(这个类就是我们常见的servlet了)
所以,当我pom.xml一旦加载了springboot-starter-web 启动的服务类型就会变成SERVLET.
初步的结论就是,如果一个服务即引用了web 又引用了webflux 那服务将会以tomcat服务 启用servlet的机制
否则就会是 netty的 handler机制了。