Spring AOP統一異常處理
簡介
在Controller層,Service層,可能會有很多的try catch代碼塊。這將會嚴重影響代碼的可讀性、“美觀性”。怎樣才可以把更多的精力放在業務代碼的開發,同時代碼變得更加簡潔?既然業務代碼不顯式地對異常進行捕獲、處理,而異常肯定還是處理的,不然系統豈不是動不動就崩潰了,所以必須得有其他地方捕獲並處理這些異常。統一異常處理應運而生,優雅的處理各種異常。本文主要介紹的是用切面方式進行統一異常處理。
目錄結構
接下來逐一介紹作用
annotation包
這個包寫一個注解的接口,定義全局異常注解,就是最后打在需要異常處理的方法上的注解
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface GlobalExceptionLog {
Class<? extends Throwable>[] value() default {};
}
aspect包
定義處理上述注解的切面
@Component
@Aspect
public class GlobalExceptionAspect {
@Resource
private GlobalExceptionHandler globalExceptionHandler;//全局異常處理
//定義執行這個切面的注解
@Pointcut("@annotation(com.bosssoft.bes.base.common.exception.logging.annotation.GlobalExceptionLog)")
public void myExceptionHandler() {
}
//當拋出異常后執行的方法
@AfterThrowing(throwing = "ex",pointcut = "myExceptionHandler()")
public void afterThrowing(JoinPoint joinPoint,BaseException ex){
...
//全局異常處理
}
}
enums包
定義枚舉類,用於自定義異常
public enum ResultEnum {
SUCCESS(000000,"成功"),
SYSTEM_ERROR(100000,"系統錯誤"),
;
private int code;
private String message;
private ResultEnum(int code, String message){
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMsg() {
return message;
}
}
exception包
自定義異常類
public class BusinessException extends BaseException {
public BusinessException(ResultEnum resultEnum) {
super(resultEnum);
}
public BusinessException(String message, int code) {
super(message, code);
}
}
handler包
全局異常處理
@ControllerAdvice//控制層增強
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
@ResponseBody
public CommonResponse handle(Exception e){
//執行方法,CommonResponse是自定義的應答類型,用其他也可以
...
}