SpringBoot中如何去除异常返回消息中的多余反斜杠
原因说明
你看到的反斜杠不属于业务返回的有效内容,本质是两种情况导致的:
- 第一种是JSON标准序列化的正常转义:JSON语法要求字符串值内部的双引号必须用
\转义为\",否则会和包裹字符串的边界双引号冲突,导致JSON结构损坏。你在Postman的Raw原始响应视图看到的转义符是JSON文本的语法组成部分,不是实际返回的业务字符。 - 第二种是全局异常处理逻辑存在重复序列化问题,导致反序列化后的业务字符串里仍然保留反斜杠,属于代码bug。
对应解决方案
情况1:仅原始JSON视图可见反斜杠,解析后无异常
这种不需要修改任何代码,属于正常表现:
- 切换Postman响应栏的
Pretty/Preview视图,就能看到无转义符的正常文本:city with name "Toronto" not found! - 前端、其他服务调用该接口时,对响应做标准JSON解析后,拿到的errors字段内容不会带反斜杠,完全不影响业务使用。
你代码里拼接双引号的写法可以优化为更易读的形式,不需要手动拼接'"'字符:
// 优化后的异常抛出代码 throw new DataNotFoundException(String.format("city with name \"%s\" not found!", name));
情况2:JSON解析后拿到的字符串仍带反斜杠
这是异常处理逻辑存在重复序列化导致的,常见于全局异常处理器中手动把字符串做了JSON序列化后再塞入响应字段,比如错误写法示例:
@ExceptionHandler(DataNotFoundException.class) public ResponseEntity<ErrorResp> handleDataNotFound(DataNotFoundException e) { ErrorResp resp = new ErrorResp(); resp.setStatus("NOT_FOUND"); resp.setMessage("Entity not found"); // 错误:手动调用writeValueAsString把普通字符串转成了JSON格式字符串,再交给框架序列化会二次转义 resp.setErrors(List.of(objectMapper.writeValueAsString(e.getMessage()))); return ResponseEntity.status(404).body(resp); }
修复步骤:
- 移除异常处理逻辑中手动对错误消息做JSON序列化的代码,直接把原始Java字符串传入errors字段,交给Spring默认集成的Jackson序列化器统一处理即可
- 检查自定义错误响应类、异常拦截逻辑,确认没有对消息字段做额外的转义、字符串包装操作
- 如果同时配置了Spring默认错误处理规则和自定义全局异常处理器,排查是否存在两者冲突导致的重复序列化问题,保留一套异常处理逻辑即可。
内容的提问来源于stack exchange,提问作者Alex Korn
相关产品推荐
相关产品推荐

