如何在Spring Boot 2.1.4.RELEASE中替换白标错误页并保留REST JSON响应
嘿,我来帮你搞定这个问题!结合你的技术栈(Spring Boot 2.1.4 + Angular 2 + 外部Tomcat 9),我们可以通过以下几个简单步骤实现自定义HTML错误页替换白标页,同时保留REST请求的JSON错误响应:
1. 创建自定义静态错误页面
Spring Boot默认会从static/error或templates/error目录下查找错误页面,优先匹配对应HTTP状态码的页面(比如404.html对应404错误),找不到则使用通用的error.html。
- 在你的项目
src/main/resources/static/目录下创建error子目录 - 按需创建错误页面,比如:
404.html:处理404资源未找到错误500.html:处理500服务器内部错误error.html:通用错误页(当没有匹配状态码的页面时使用)
这些页面可以是纯静态HTML,也可以复用Angular的样式来保持项目风格统一。
2. 利用Spring Boot默认错误处理逻辑
默认情况下,Spring Boot的BasicErrorController已经帮我们做好了请求类型区分:
- 当请求头
Accept为text/html(浏览器请求)时,会自动查找并返回你创建的静态错误页面,完全替代白标页 - 当请求头
Accept为application/json(REST接口请求)时,会返回标准的JSON错误响应(包含timestamp、status、error、message等字段)
这一步不需要额外编写代码,Spring Boot原生逻辑就能满足需求!
3. 处理Angular单页应用的路由 fallback(可选)
因为你的Angular代码放在static目录,当用户直接访问Angular的客户端路由(比如/dashboard)时,外部Tomcat会认为这是不存在的服务器端路径,返回404错误。如果希望这种情况跳转到Angular首页而非静态错误页,可以二选一配置:
方式一:Spring Boot控制器转发
创建一个控制器,将所有非静态资源的请求转发到Angular的index.html:
@Controller public class RouteFallbackController { @RequestMapping(value = "/**/{path:[^.]*}") public String redirectToAngular() { return "forward:/index.html"; } }
这样所有客户端路由请求都会交给Angular的路由系统处理。
方式二:Tomcat重写规则
在src/main/webapp/WEB-INF目录下创建rewrite.config文件:
# 排除API、静态资源、错误页路径,其他请求转发到index.html RewriteCond %{REQUEST_URI} !^/(api|static|error)/.*$ RewriteRule ^(.*)$ /index.html [L]
然后在web.xml中配置重写阀(没有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"> <valve> <className>org.apache.catalina.valves.rewrite.RewriteValve</className> </valve> </web-app>
4. 打包部署到外部Tomcat
确保你的Spring Boot项目正确打包为WAR包:
- 在
pom.xml中设置<packaging>war</packaging> - 排除嵌入式Tomcat依赖(避免和外部Tomcat冲突):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
执行mvn clean package生成WAR包,放到Tomcat的webapps目录下启动即可。
验证效果
- 用浏览器访问不存在的服务器端路径(比如
/non-existent-api),应该看到你自定义的HTML错误页 - 用Postman等工具发送REST请求(设置
Accept: application/json)到报错接口,应该返回JSON格式的错误响应
内容的提问来源于stack exchange,提问作者marcg

