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

如何自定义500内部服务器错误的返回提示信息(插入重复ID场景)

实现方案

方案1:全局异常处理器(推荐,适合统一管理所有业务异常返回)

你现在遇到的问题是抛出的IllegalArgumentException没有被自定义逻辑捕获,所以走了SpringBoot默认的异常处理逻辑,返回通用500提示。用全局异常处理器可以统一拦截所有Controller层抛出的异常,自定义返回结构:

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

@RestControllerAdvice
public class GlobalExceptionHandler {
    // 指定捕获IllegalArgumentException类型的异常
    @ExceptionHandler(IllegalArgumentException.class)
    public ResponseEntity<ResponseSave> handleIdExistException(IllegalArgumentException e) {
        ServiceMessage errorMsg = new ServiceMessage();
        errorMsg.setCode("500");
        // 直接读取你抛出的异常里的自定义信息
        errorMsg.setDescription(e.getMessage());
        errorMsg.setType("Internal Server Error");
        // 也可以根据业务需要把HTTP状态码改成409 Conflict,更符合资源已存在的语义
        return new ResponseEntity<>(ResponseSave.createResponseSave(errorMsg, null), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

配置完成后确认你的枚举类PlanSearchEnum中RECORD_ALREADY_EXIST对应的值设置为Id already exist, Cannot create record即可。

方案2:Controller层手动捕获(适合临时单接口调整)

如果只需要改这一个接口的异常返回,也可以直接在Controller层加try-catch处理:

@PostMapping(value = "/plans")
public ResponseEntity<ResponseSave> savePostPlanDetails(
        @Valid @RequestBody(required = true) Plan plan) throws ParseException {
    String planId = plan.getPlanId();
    try {
        Integer createdId = planDataService.savePlan(plan, planId);
        ServiceMessage serviceMessage = ServiceMessage.createCreatedServiceMessage();
        return new ResponseEntity<>(ResponseSave.createResponseSave(serviceMessage, createdId), HttpStatus.CREATED);
    } catch (IllegalArgumentException e) {
        ServiceMessage errorMsg = new ServiceMessage();
        errorMsg.setCode("500");
        errorMsg.setDescription(e.getMessage());
        errorMsg.setType("Internal Server Error");
        return new ResponseEntity<>(ResponseSave.createResponseSave(errorMsg, null), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

优化建议

你可以自定义专属的业务异常类替代通用的IllegalArgumentException,避免全局捕获时误伤其他业务场景抛出的同类型异常,示例如下:

// 自定义业务异常类
public class BusinessException extends RuntimeException{
    public BusinessException(String message) {
        super(message);
    }
}

业务代码抛出该自定义异常,全局异常处理器仅捕获BusinessException类型即可。

内容的提问来源于stack exchange,提问作者Masoom Raza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:09:04