You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:35:39