Axios的statusText始终为空,无法获取Spring Boot抛出的RuntimeException异常信息
问题根源
- 协议层面:HTTP/2 标准已完全移除响应状态描述(
statusText)字段,所有兼容HTTP/2的服务端、浏览器都会默认返回空字符串,属于协议层面的限制,和框架无关。 - Spring Boot 配置层面:从2.3版本开始,
server.error.include-message配置项默认值为never,即默认不会将异常的自定义消息填充到响应内容中。 @ResponseStatus注解的作用仅是指定异常对应的响应状态码,不会自动将异常消息写入statusText或响应体。
解决方案
推荐方案:使用结构化响应体传递错误信息(兼容性最好,符合REST规范)
该方案不受HTTP协议版本限制,是目前业界通用的错误返回方式:
- 新增全局异常处理器,统一捕获自定义异常并返回结构化错误信息
@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(BadRequestException.class) public ResponseEntity<Map<String, Object>> handleBadRequestException(BadRequestException e) { Map<String, Object> errorResult = new HashMap<>(); errorResult.put("code", HttpStatus.BAD_REQUEST.value()); errorResult.put("message", e.getMessage()); return new ResponseEntity<>(errorResult, HttpStatus.BAD_REQUEST); } }
- Axios 侧直接从响应体中读取错误信息即可
.catch((error) => { // 自定义错误消息可直接从响应体的message字段获取 console.log(error.response.data.message) })
兼容方案:强制从statusText获取(不推荐,仅适用于HTTP/1.1场景)
如果必须依赖statusText传递消息,需要做两处调整:
- 在Spring Boot配置文件
application.properties中开启异常消息返回:
# 开启异常消息返回 server.error.include-message=always # 服务端强制使用HTTP/1.1协议(HTTP/2下statusText必然为空) server.http2.enabled=false
- 异常类的
@ResponseStatus注解补充reason属性:
@ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "自定义错误") public class BadRequestException extends RuntimeException { public BadRequestException(String message) { super(message); } }
补充说明
fetch能拿到消息的核心原因是测试场景下默认走了HTTP/1.1协议,且未触发Spring Boot的消息屏蔽规则,Axios本身不会过滤statusText字段,无返回的核心原因是服务端未传递或协议不支持。
内容的提问来源于stack exchange,提问作者ProbDed
相关产品推荐
相关产品推荐

