SpringMVC配置报错:DispatcherServlet无法赋值给Servlet接口
解决SpringMVC中DispatcherServlet类型不匹配问题
核心原因
这个错误本质是Servlet API版本与SpringMVC版本不兼容:
- SpringMVC 5.x及以下依赖
javax.servlet包(Java EE体系) - SpringMVC 6.x及以上强制依赖
jakarta.servlet包(Jakarta EE体系)
两者的Servlet类属于不同包空间,完全不兼容。
分步排查与修复
1. 统一依赖版本体系
如果使用SpringMVC 6.x+:
必须移除所有javax.servlet-api依赖,替换为Jakarta EE版本:<dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> <scope>provided</scope> </dependency>同时确保SpringMVC版本为6.x+,示例:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>6.1.2</version> </dependency>如果使用SpringMVC 5.x及以下:
必须保留javax.servlet-api,推荐版本4.0.1(兼容多数容器):<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>SpringMVC版本对应5.x,示例:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.30</version> </dependency>
2. 检查web.xml命名空间
若用Jakarta EE(SpringMVC 6.x+),web.xml必须使用Jakarta命名空间:
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd" version="6.0"> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> </web-app>若用Java EE(SpringMVC 5.x),web.xml使用旧命名空间:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> </web-app>
3. 清理冲突依赖
执行依赖树命令检查是否有第三方依赖引入不同版本的Servlet API:
- Maven:
mvn dependency:tree - Gradle:
./gradlew dependencies
找到冲突依赖后用<exclusions>排除,示例:
<dependency> <groupId>第三方包groupId</groupId> <artifactId>第三方包artifactId</artifactId> <exclusions> <exclusion> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </exclusion> </exclusions> </dependency>
4. 匹配容器版本
- Tomcat 10.x及以上支持Jakarta EE(对应SpringMVC 6.x+)
- Tomcat 9.x及以下支持Java EE(对应SpringMVC 5.x)
禁止混用容器与依赖版本,比如Tomcat 9搭配SpringMVC 6.x必然报错。
内容的提问来源于stack exchange,提问作者Aldar
相关产品推荐
相关产品推荐

