Spring boot 通過(guò)AOP思想,使用注解@RestControllerAdvice將異常統(tǒng)一到一個(gè)地方進(jìn)行處理眯牧,這樣可以避免代碼中到處捕獲和處理異常话浇,讓代碼保持干凈整潔挽鞠。
簡(jiǎn)單對(duì)象的創(chuàng)建
首先創(chuàng)建一個(gè)枚舉類型牵署,用來(lái)保存各種返回狀態(tài)
public enum ResultCode {
SUCCESS(200, "成功"),
PARAM_INVALID(401, "參數(shù)無(wú)效"),
TASK_NULL(404, "任務(wù)不存在"),
...
private int code;
private String msg;
ResultCode(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
然后再有一個(gè)統(tǒng)一的controller返回對(duì)象類:
public class ResultJson<T> implements Serializable{
private static final long serialVersionUID = 783015033603078674L;
private int code;
private String msg;
private T data;
public ResultJson (ResultCode resultCode,T data) {
setResultCode(resultCode);
this.data = data;
}
public static ResultJson success() {
ResultJson resultJson = new ResultJson();
resultJson.setResultCode(ResultCode.SUCCESS);
return resultJson;
}
public static <T> ResultJson success(T data){
return new ResultJson(ResultCode.SUCCESS, data);
}
public static ResultJson failure(ResultCode resultCode){
ResultJson resultJson = new ResultJson();
resultJson.setResultCode(resultCode);
return resultJson;
}
public void setResultCode(ResultCode resultCode) {
this.code = resultCode.getCode();
this.msg = resultCode.getMsg();
}
...省略構(gòu)造方法和getter和setter方法漏隐;
}
自定義異常類:
public class CustomException extends RuntimeException {
private static final long serialVersionUID = 2984474148327146104L;
private ResultCode resultCode;
public CustomException(ResultCode resultCode) {
this.resultCode = resultCode;
}
...省略getter和setter方法;
}
然后就是創(chuàng)建一個(gè)統(tǒng)一異常處理的類了
@RestControllerAdvice
public class DefaultExceptionHandler {
private Logger logger = LoggerFactory.getLogger(DefaultExceptionHandler.class);
/**
* 處理所有自定義異常
* @param e
* @return
*/
@ExceptionHandler(CustomException.class)
public ResultJson handleCustomException(CustomException e){
return ResultJson.failure(e.getResultCode());
}
...這里可以增加其他想處理的異常
/**
* 處理所有異常
* @param e
* @return
*/
@ExceptionHandler(Exception.class)
public ResultJson handleException(Exception e){
logger.error(e.getMessage());
return ResultJson.failure(ResultCode.SERVER_ERROR);
}
}
該類會(huì)攔截controller轉(zhuǎn)發(fā)的請(qǐng)求過(guò)程中產(chǎn)生的異常,只要在異常處理類中定義的異常都可以被捕獲處理奴迅,并返回給controller調(diào)用者青责。
業(yè)務(wù)方法中就可以不用去處理異常了。異常都集中到一處處理取具,修改也方便脖隶,而且所有定義的異常都能按照格式返回到前臺(tái)。