Spring MVC项目运行出现White-label Error Page 404白页错误如何解决?
错误产生原因
你当前使用Spring Boot + Spring MVC的混合架构,配置逻辑存在多处冲突,导致请求无法被正确处理:
- Spring Boot默认接管所有Servlet请求分发,你自定义的
@WebServlet注解未被Spring Boot扫描注册,访问/login路径时找不到对应的处理逻辑,直接返回404 - 依赖重复冗余:你已经引入
spring-boot-starter-web,该依赖已内置spring-webmvc、嵌入式Tomcat、Servlet API,额外单独引入的同名依赖和父依赖管理的版本存在兼容性冲突,会导致类加载异常 - 缺少JSP支持配置:Spring Boot默认不支持JSP渲染,你既没有配置视图解析器的前缀后缀,也没有引入JSP解析所需的
tomcat-embed-jasper依赖,就算请求能到达Servlet,也无法正常转发到JSP页面 - 插件版本不兼容:你使用的
tomcat7-maven-plugin对应Tomcat7版本,仅支持Servlet 3.0及以下规范,但你的web.xml使用3.1规范,同时Spring Boot 2.5.5最低要求Tomcat9版本,版本不兼容导致请求无法正常处理
修复步骤
- 第一步:清理冗余依赖
从pom.xml中删除单独引入的spring-webmvc、tomcat-servlet-api两个依赖,spring-boot-starter-web已经包含对应兼容版本,可避免版本冲突 - 第二步:新增JSP支持依赖
在pom.xml的dependencies节点中添加如下依赖:<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> - 第三步:注册请求处理逻辑,二选一即可:
- 保留原生Servlet写法:在Spring Boot启动类上添加
@ServletComponentScan注解,Spring Boot会自动扫描注册项目中所有带@WebServlet注解的自定义Servlet - 改用标准Spring MVC写法(更推荐):删除继承HttpServlet的Login类,替换为Spring MVC Controller:
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class LoginController { @GetMapping("/login") public String loginPage() { return "login"; } } - 保留原生Servlet写法:在Spring Boot启动类上添加
- 第四步:配置JSP视图解析器
在src/main/resources目录下新建application.properties文件,添加如下配置:spring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view.suffix=.jsp - 第五步:调整运行方式
删除pom.xml中的tomcat7-maven-plugin插件,直接用mvn spring-boot:run命令启动项目;如果需要打war包部署,将war包放到Tomcat9及以上版本的webapps目录下运行即可 - 第六步:调整欢迎页配置
你当前web.xml中配置的欢迎页login.jsp存放在WEB-INF目录下无法直接被访问,可将欢迎页修改为/login,访问根路径时会自动跳转到登录页面
内容的提问来源于stack exchange,提问作者Mahmoud Hamarsheh
相关产品推荐
相关产品推荐

