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

JSON错误响应含异常信息:Postman无法获取重复邮箱异常消息排查

嘿,我知道问题出在哪了——你现在抛出的是普通的Exception类,Spring Boot默认的异常处理机制不会把这类异常的自定义消息暴露到JSON响应中,只会返回一个通用的错误结构(比如包含时间戳、状态码,但没有你要的自定义提示),这就是Postman拿不到消息的原因。

解决方案

下面是两种常用的修复方式,优先推荐第一种更规范的全局异常处理方案:

方式一:自定义异常 + 全局异常处理器(生产环境推荐)

1. 创建自定义异常类

先定义一个专门的异常类来表示用户已存在的场景,语义更清晰,也方便统一处理:

public class UserAlreadyExistsException extends RuntimeException {
    public UserAlreadyExistsException(String message) {
        super(message);
    }
}

这里选择继承RuntimeException是因为不需要在方法上显式声明抛出,代码更简洁;如果需要检查型异常,也可以继承Exception,但要在Controller方法上添加throws声明。

2. 修改Controller的异常抛出逻辑

把原来的throw new Exception(...)替换成自定义异常:

@RestController
public class RegistrationController {
    @Autowired
    private RegistrationService service;

    @PostMapping("/registeruser")
    public User registerUser(@RequestBody User user) {
        String tempEmailId = user.getEmailId();
        if(tempEmailId != null && !tempEmailId.isEmpty()) {
            User userObject = service.fetchUserByEmailId(tempEmailId);
            if(userObject != null) {
                // 抛出自定义异常
                throw new UserAlreadyExistsException("User with " + tempEmailId + " already exists");
            }
        }
        return service.saveUser(user);
    }
}

3. 编写全局异常处理器

用@RestControllerAdvice创建一个全局异常处理类,捕获自定义异常并返回结构化的JSON响应:

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.Map;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(UserAlreadyExistsException.class)
    public ResponseEntity<Map<String, String>> handleUserAlreadyExistsException(UserAlreadyExistsException ex) {
        Map<String, String> errorResponse = new HashMap<>();
        errorResponse.put("errorMessage", ex.getMessage());
        errorResponse.put("statusCode", String.valueOf(HttpStatus.CONFLICT.value()));
        errorResponse.put("status", HttpStatus.CONFLICT.getReasonPhrase());
        return new ResponseEntity<>(errorResponse, HttpStatus.CONFLICT);
    }
}

这里用HttpStatus.CONFLICT(409状态码)比默认的500更贴合业务场景,因为这属于请求资源(用户)已存在的冲突。

方式二:临时配置(仅开发阶段使用)

如果只是想快速测试效果,也可以在application.properties中添加以下配置,让Spring Boot直接返回异常的自定义消息:

server.error.include-message=always
server.error.include-binding-errors=always

不过这种方式会暴露所有异常的消息,安全性和灵活性不如自定义全局处理器,不建议在生产环境使用。

验证效果

现在用Postman重复提交同一个邮箱的注册请求,你会得到类似这样的JSON响应:

{
  "errorMessage": "User with test@example.com already exists",
  "statusCode": "409",
  "status": "Conflict"
}

内容的提问来源于stack exchange,提问作者ehsan hosseini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:12:44