Maven+SpringMVC项目部署Tomcat10报DispatcherServlet实例化500错误如何解决
问题核心原因
你遇到的报错是Tomcat 10和旧版本Spring的包命名不兼容导致的:
Tomcat 10及以上版本将Java EE规范全部迁移到了Eclipse基金会,所有原javax.servlet开头的包全部重命名为jakarta.servlet开头。而你当前使用的Spring 4.1.8是多年前的旧版本,仅支持javax.servlet包,无法识别Tomcat 10提供的jakarta.servlet类,因此DispatcherServlet实例化失败。
修复步骤
方案1:降级Tomcat(成本最低,适配现有教程代码)
直接将当前的Tomcat 10替换为Tomcat 9.x版本,Tomcat 9仍然使用javax.servlet包,和你现有所有依赖完全兼容,仅需额外修改1处代码:
将AddController.java中的导入语句替换为javax版本:
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
修改完成后重新部署项目即可正常运行。
方案2:升级依赖适配Tomcat 10(使用新版环境)
如果要保留Tomcat 10,需要升级所有相关依赖到支持jakarta规范的版本:
- 修改
pom.xml的依赖如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.telusko</groupId> <artifactId>DemoMVC</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>DemoMVC Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <!-- Spring 6+ 支持jakarta规范 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.0.11</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>6.0.11</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> <!-- jakarta版本jstl --> <dependency> <groupId>jakarta.servlet.jsp.jstl</groupId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId> <version>3.0.0</version> </dependency> </dependencies> <build> <finalName>DemoMVC</finalName> </build> </project>
- 更新
telusko-servlet.xml的schema版本和Spring 6对齐,避免解析错误:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <context:component-scan base-package="com.telusko"/> <mvc:annotation-driven/> </beans>
- 给web.xml的DispatcherServlet添加启动加载配置,优化启动体验:
<servlet> <servlet-name>telusko</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>telusko</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
修改完成后清空Maven缓存重新构建部署即可。
额外注意点
如果使用方案2,需要确保你的JDK版本在17及以上,Spring 6最低要求JDK 17运行环境。
内容的提问来源于stack exchange,提问作者Hay Asa
相关产品推荐
相关产品推荐

