說明
在實(shí)際的開發(fā)過程中,很多時(shí)候要定義符合自己業(yè)務(wù)的錯(cuò)誤碼和錯(cuò)誤信息不瓶,而不是統(tǒng)一的而不是統(tǒng)一的下面這種格式返回到調(diào)用端
INTERNAL_SERVER_ERROR(500, "Internal Server Error"),
1
下面我們來看看如何將我們自定義的錯(cuò)誤碼和錯(cuò)誤信息返回到調(diào)用端聚谁。
首先我們要定義一個(gè)枚舉類
public enum ErrorEnum {
/*
* 錯(cuò)誤信息
* */
E_20011(20011, "缺少必填參數(shù)"),
;
private Integer errorCode;
private String errorMsg;
ErrorEnum(Integer errorCode, String errorMsg) {
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
public Integer getErrorCode() {
return errorCode;
}
public String getErrorMsg() {
return errorMsg;
}
定義一個(gè)異常類繼承RuntimeException類
public class BusinessException extends RuntimeException {
? ? private static final long serialVersionUID = 1L;
? ? private Integer code;
? ? /**
? ? * @param errorEnum 以錯(cuò)誤的ErrorEnum做參數(shù)
? ? */
? ? public BusinessException(ErrorEnum errorEnum) {
? ? ? ? super(errorEnum.getErrorMsg());
? ? ? ? this.code = errorEnum.getErrorCode();
? ? }
? ? public Integer getCode() {
? ? ? ? return code;
? ? }
? ? public void setCode(Integer code) {
? ? ? ? this.code = code;
? ? }
}
模板類定義了如何將異常通過什么形式進(jìn)行返回橄抹。
public class ExceptionResponse {
? ? private String message;
? ? private Integer code;
? ? public ExceptionResponse(Integer code, String message) {
? ? ? ? this.message = message;
? ? ? ? this.code = code;
? ? }
? ? public static ExceptionResponse create(Integer code, String message) {
? ? ? ? return new ExceptionResponse(code, message);
? ? }
? ? public Integer getCode() {
? ? ? ? return code;
? ? }
? ? public String getMessage() {
? ? ? ? return message;
? ? }
}
@ControllerAdvice
@Slf4j
public class ExceptionHandler {
? ? @ResponseBody
? ? @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
? ? @ExceptionHandler(Exception.class)
? ? public ExceptionResponse handleException(Exception ex) {
? ? ? ? if (ex instanceof BusinessException) {
? ? ? ? ? ? log.warn(ex.getMessage(), ex);
? ? ? ? ? ? BusinessException businessException = (BusinessException) ex;
? ? ? ? ? ? return ExceptionResponse.create(businessException.getCode(), businessException.getMessage());
? ? ? ? } else {
? ? ? ? ? ? log.error(ex.getMessage(), ex);
? ? ? ? ? ? return ExceptionResponse.create(HttpStatus.INTERNAL_SERVER_ERROR.value(), ex.getMessage());
? ? ? ? }
? ? }
}
定義Controller層
@PostMapping("test/exception")
? ? public String testException() {
? ? ? ? throw new BusinessException(ErrorEnum.E_20011);
? ? }
通過postMan調(diào)用返回結(jié)果為
{ "message": "缺少必填參數(shù)", "code": 20011 }