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

Heroku部署Spring Boot API后4xx错误缺失message字段问题

问题原因

Heroku默认将Spring Boot应用识别为生产环境,而Spring Boot的安全默认配置在生产环境下会隐藏错误响应中的message字段——这是出于安全考量,避免泄露系统敏感信息。本地开发环境(默认是dev)则默认开启该字段的返回。

解决方法

以下是几种可行的处理方式:

1. 通过配置文件开启生产环境的错误消息显示

在application-prod.properties(或application-prod.yml)中添加配置,强制生产环境返回message字段:

# 始终包含错误消息
server.error.include-message=always
# 如需包含参数绑定错误信息,可同步开启
server.error.include-binding-errors=always

若使用YAML格式:

server:
  error:
    include-message: always
    include-binding-errors: always

Heroku会自动加载prod环境配置,修改后生产环境的4xx响应就能正常显示message字段。

2. 自定义全局异常处理器

通过@ControllerAdvice实现全局异常拦截,手动构造包含message的响应体,不受环境配置限制:

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.server.ResponseStatusException;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

@ControllerAdvice
public class CustomExceptionHandler {

    @ExceptionHandler(ResponseStatusException.class)
    public ResponseEntity<Object> handleResponseStatusException(ResponseStatusException ex) {
        Map<String, Object> responseBody = new HashMap<>();
        responseBody.put("timestamp", LocalDateTime.now().toString());
        responseBody.put("status", ex.getStatusCode().value());
        responseBody.put("error", ex.getStatusCode().getReasonPhrase());
        responseBody.put("message", ex.getReason());
        responseBody.put("path", ex.getRequestPath());

        return new ResponseEntity<>(responseBody, ex.getStatusCode());
    }
}

这个处理器会捕获所有ResponseStatusException,并构造包含完整字段的响应JSON。

3. 强制指定Heroku环境为开发环境(不推荐)

在Heroku的环境变量中添加SPRING_PROFILES_ACTIVE=dev,让应用以开发环境配置运行。但这种方式会关闭生产环境的安全防护,仅适合临时调试,不建议正式部署时使用。

内容的提问来源于stack exchange,提问作者shai siso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 13:01:55