Spring Boot中如何配置并展示自定义404 page not found JSP页面
Spring Boot 替换默认Whitelabel页为自定义404页面实现方案
优先推荐新手使用错误页注册的实现方式,配置简单且不会影响静态资源(CSS/JS/图片等)的正常访问,步骤如下:
1. 基础配置调整
在项目的application.properties配置文件中添加以下配置(如果用yml格式自行对应层级即可):
# 关闭Spring Boot默认的白标错误页 server.error.whitelabel.enabled=false # 配置JSP视图前缀,对应你存放JSP文件的src/main/webapp/views目录 spring.mvc.view.prefix=/views/ # 配置JSP视图后缀 spring.mvc.view.suffix=.jsp
2. 注册404错误页映射
新建配置类注册404状态码对应的跳转路径:
import org.springframework.boot.web.server.ErrorPage; import org.springframework.boot.web.server.ErrorPageRegistrar; import org.springframework.boot.web.server.ErrorPageRegistry; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; @Configuration public class ErrorPageConfig implements ErrorPageRegistrar { @Override public void registerErrorPages(ErrorPageRegistry registry) { // 所有返回404状态码的请求,都转发到/page-not-found路径 registry.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/page-not-found")); } }
3. 添加视图映射
新建MVC配置类,把错误跳转路径和你已经创建好的JSP页面做绑定:
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { // /page-not-found路径直接映射到page-not-found.jsp视图 registry.addViewController("/page-not-found").setViewName("page-not-found"); } }
4. 依赖检查(必做)
如果项目还没引入JSP解析相关依赖,内嵌Tomcat无法正常渲染JSP页面,Maven项目在pom.xml中添加以下依赖即可:
<!-- 内嵌Tomcat JSP渲染支持 --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> <!-- 页面用到JSTL标签时才需要添加 --> <dependency> <groupId>jakarta.servlet.jsp.jstl</groupId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId> </dependency>
验证方式
重启项目后,访问任意不存在的路径(比如你举例的/blog/unknown-parameter),就会直接展示你自定义的page-not-found.jsp页面,不会再出现默认的Whitelabel错误页。如果测试时不生效,优先用浏览器无痕模式访问,避免本地缓存干扰。
可选方案:全局异常捕获(适合需要统一处理多类错误的场景)
如果后续需要同时处理500、403等其他错误,可以用全局异常拦截的方式实现,注意这个方案需要额外加配置,否则404异常不会被拦截:
- 先在
application.properties追加配置:
# 找不到请求路径时抛出异常,方便全局拦截 spring.mvc.throw-exception-if-no-handler-found=true
- 新建全局异常处理类:
import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.servlet.NoHandlerFoundException; @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(NoHandlerFoundException.class) public String handle404() { return "page-not-found"; } }
注意:这个方案如果配置不当会导致静态资源无法访问,新手优先用前面的错误页注册方案即可。
内容的提问来源于stack exchange,提问作者Rakhi
相关产品推荐
相关产品推荐

