如何自定义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
相关产品推荐
相关产品推荐

