spring-boot.version2.6升级到2.7.18后security报错

文章讲述了在将SpringBoot和SpringCloud版本升级后,SpringSecurity自动从5.6.0升至5.7.11引发的序列化问题。用户需要清理Redis中的旧登录信息,以解决因版本不一致导致的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

版本如下

<spring-boot.version>2.7.18</spring-boot.version>
<spring-cloud.version>2021.0.8</spring-cloud.version>
<spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>

升级后,

spring-security由原来的5.6.0版本自动升级到了5.7.11版本,然后登录的时候一直报错

 Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.io.InvalidClassException: org.springframework.security.core.userdetails.User; local class incompatible: stream classdesc serialVersionUID = 560, local class serialVersionUID = 570


版本不一致,然后百度说5.7的版本升级了,写法不一样了,又要改各种东西,折腾了半天发现

只要把redis里面之前存的登录信息session之类的全部清空,再次请求登录接口,就返回成功了。。。。。

org.springframework.boot.web.context.MissingWebServerFactoryBeanException: No qualifying bean of type 'org.springframework.boot.web.servlet.server.ServletWebServerFactory' available: Unable to start AnnotationC onfigServletWebServerApplicationContext due to missing ServletWebServerFactory bean at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getWebServerFactory(ServletWebServerApplicationContext.java:212) ~[spring-boot-2.7.18.jar!/:2.7.18] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:182) ~[spring-boot-2.7.18.jar!/:2.7.18] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:162) ~[spring-boot-2.7.18.jar!/:2.7.18] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:585) ~[spring-context-5.3.31.jar!/:5.3.31] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.18.jar!/:2.7.18] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) [spring-boot-2.7.18.jar!/:2.7.18] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:409) [spring-boot-2.7.18.jar!/:2.7.18] at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) [spring-boot-2.7.18.jar!/:2.7.18] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) [spring-boot-2.7.18.jar!/:2.7.18] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1289) [spring-boot-2.7.18.jar!/:2.7.18] at com.aleks.MainApplication.main(MainApplication.java:10) [classes!/:1.0.0] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_241] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_241] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_241] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_241] at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) [main-deploy-1.0.0.jar:1.0.0] at org.springframework.boot.loader.Launcher.launch(Launcher.java:108) [main-deploy-1.0.0.jar:1.0.0] at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) [main-deploy-1.0.0.jar:1.0.0] at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65) [main-deploy-1.0.0.jar:1.0.0] 2025-03-12 09:49:27.606 ERROR 3532 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPLICATION FAILED TO START *************************** Description: Web application could not be started as there was no org.springframework.boot.web.servlet.server.ServletWebServerFactory bean defined in the context. Action: Check your application's dependencies for a supported servlet web server. Check the configured web application type.
03-13
<think>嗯,用户遇到了一个Spring Boot的异常:MissingWebServerFactoryBeanException,提示没有找到ServletWebServerFactory的Bean。我需要帮他分析这个问题。首先,这个异常通常发生在Spring Boot应用启动时无法检测到内嵌的Servlet容器,比如Tomcat、Jetty或者Undertow。那么可能的原因有哪些呢? 首先,用户可能没有包含相关的依赖。比如,如果使用Maven或Gradle,可能漏掉了spring-boot-starter-web,这个starter会默认引入Tomcat。或者,用户可能排除了Tomcat的依赖,而换用了其他容器但没有正确配置。例如,排除Tomcat后,如果没有添加Jetty或Undertow的starter,就会导致这个问题。 其次,检查项目的依赖管理是否正确。有时候,父POM可能没有正确继承Spring Boot的starter parent,或者BOM(Bill of Materials)没有被引入,导致版本冲突或依赖缺失。另外,用户可能在配置文件中错误地设置了web应用类型,比如设置spring.main.web-application-type=none,这样Spring Boot就不会自动配置Servlet容器。 还有一个情况是用户自己定义了一个ServletWebServerFactory的Bean,但可能配置有问题,导致Spring无法正确创建这个Bean。或者,主应用类所在的包扫描路径不正确,导致相关的自动配置类没有被加载。 那用户应该如何解决这个问题呢?首先检查pom.xml或build.gradle文件,确认是否有引入spring-boot-starter-web。如果没有,添加相应的依赖。如果有的话,看看是否排除了Tomcat的依赖,这时候需要确保添加了其他容器的starter。例如,如果换用Jetty,需要添加spring-boot-starter-jetty。 然后,检查应用的配置文件,比如application.properties或application.yml,确保没有错误设置web应用类型。如果不需要web应用,可能需要调整启动方式,但如果是web应用,类型应该设置为servlet。 另外,如果用户自定义了ServletWebServerFactory,需要检查Bean的配置是否正确,是否有条件注解导致Bean未被创建。还有主类上的注解是否正确,比如@SpringBootApplication是否在正确的包下,确保组件扫描能够找到配置类。 最后,用户可能需要清理和重新构建项目,有时候旧的构建文件可能导致依赖问题。运行mvn clean install或gradle clean build,然后重新启动应用。 可能还需要查看依赖树,确认是否有冲突或排除的情况。使用Maven的mvn dependency:tree或Gradle的gradle dependencies命令来检查依赖关系。确保ServletWebServerFactory相关的依赖被正确引入。 总结下来,解决步骤大致是:检查依赖、检查配置、检查自定义Bean、确保包扫描正确,清理并重新构建项目。如果用户按照这些步骤排查,应该能找到问题所在并解决。</think>### 问题分析:`MissingWebServerFactoryBeanException` 这个异常表示 **Spring Boot 无法找到 Servlet 容器工厂**(如 Tomcat、Jetty、Undertow),导致无法启动 Web 应用。以下是常见原因和解决步骤: --- ### 1. 依赖缺失或配置错误 #### 可能原因: - **未添加 `spring-boot-starter-web` 依赖**:Spring Boot 默认通过此依赖引入 Tomcat。 - **主动排除了 Tomcat 依赖但未替换其他容器**:例如排除了 Tomcat 但未添加 Jetty 或 Undertow。 - **依赖冲突**:其他依赖覆盖了 Spring Boot 的默认容器配置。 #### 解决方案: - **检查 `pom.xml` 或 `build.gradle`**: ```xml <!-- Maven 示例 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` - 如果排除了 Tomcat,需补充其他容器依赖(例如 Jetty): ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> ``` --- ### 2. 应用类型配置错误 #### 可能原因: - **错误配置 `spring.main.web-application-type`**:设置为 `NONE` 会禁用 Servlet 容器。 - **错误的主类配置**:例如在非 Web 应用中尝试启动 Web 容器。 #### 解决方案: - **检查 `application.properties` 或 `application.yml`**: ```properties # 确保未强制设置 Web 应用类型 # spring.main.web-application-type=servlet ``` - **检查主类**:确保主类使用 `@SpringBootApplication` 注解且位于根包。 --- ### 3. 自定义 `ServletWebServerFactory` 错误 #### 可能原因: - **自定义的 `ServletWebServerFactory` Bean 未正确配置**:例如条件注解(如 `@ConditionalOnClass`)导致 Bean 未被加载。 - **包扫描路径错误**:自定义 Bean 未被 Spring 扫描到。 #### 解决方案: - **检查自定义的 Bean**: ```java @Bean public ServletWebServerFactory servletWebServerFactory() { return new TomcatServletWebServerFactory(); // 确保返回具体实现 } ``` - **确保主类包路径正确**:确保自定义 Bean 位于主类的子包下,或手动指定扫描路径: ```java @SpringBootApplication(scanBasePackages = "com.your.package") ``` --- ### 4. 清理并重新构建项目 #### 操作步骤: 1. 删除 `target`(Maven)或 `build`(Gradle)目录。 2. 重新构建项目: ```bash mvn clean install # 或 gradle clean build ``` --- ### 总结步骤 1. **检查依赖** → 确保 `spring-boot-starter-web` 存在且未被错误排除。 2. **检查配置** → 确保未强制禁用 Web 应用。 3. **检查自定义 Bean** → 确保 `ServletWebServerFactory` 正确配置。 4. **清理构建** → 避免旧构建文件干扰。 按此流程排查,通常可解决此异常。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值