自定義註解和springAOP捕獲Service層異常,並處理自定義異常操作
一 自定義異常
/** * 自定義參數為null異常 */ public class NoParamsException extends Exception { //用詳細信息指定一個異常 public NoParamsException(String message){ super(message); } //用指定的詳細信息和原因構造一個新的異常 public NoParamsException(String message, Throwable cause){ super(message,cause); } //用指定原因構造一個新的異常 public NoParamsException(Throwable cause) { super(cause); } }
二 自定義註解
/** * 統一捕獲service異常處理註解 */ @Documented @Target({ElementType.METHOD, ElementType.TYPE}) //可在類或者方法使用 @Retention(RetentionPolicy.RUNTIME) public @interface ServiceExceptionCatch { }
三 註解切面處理類
@Component @Aspect @Slf4j public class ServiceExceptionHandler { @Around("@annotation(com.zhuzher.annotations.ServiceExcepCatch) || @within(com.zhuzher.annotations.ServiceExcepCatch)") public ResponseMessage serviceExceptionHandler(ProceedingJoinPoint proceedingJoinPoint) { ResponseMessage returnMsg; try { returnMsg = (ResponseMessage) proceedingJoinPoint.proceed(); } catch (Throwable throwable) { log.error("ServiceExcepHandler serviceExcepHandler failed", throwable); //單獨處理缺少參數異常 if(throwable instanceof NoParamsException) { returnMsg = ResponseMessage.failture(ErrorCode.ARG_CAN_NOT_BE_EMPTY); }else{//其他正常返回 returnMsg=ResponseMessage.newErrorsMessage(throwable.getMessage()); } } return returnMsg; } }
即可捕獲改異常,並自定義處理邏輯!
捕獲Service層異常,統一處理
新增註解,實現類和方法層級的異常捕獲
package com.ahdruid.aop.annotation; import java.lang.annotation.*; /** * 服務異常捕獲,如捕獲Service向外拋出的異常 * <p> * 添加在類上、方法上 * */ @Documented @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface ServiceExcepCatch { }
異常處理handler
package com.ahdruid.aop; import com.ahdruid.ReturnMsg; import com.ahdruid.errorenums.BaseErrorEnum; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; /** * 服務異常捕獲處理器 * <p> * 如捕獲Service向外拋出的異常 * */ @Component @Aspect @Slf4j public class ServiceExcepHandler { @Around("@annotation(com.ahdruid.aop.annotation.ServiceExcepCatch) || @within(com.ahdruid.aop.annotation.ServiceExcepCatch)") public ReturnMsg serviceExcepHandler(ProceedingJoinPoint proceedingJoinPoint) { ReturnMsg returnMsg = new ReturnMsg(); try { returnMsg = (ReturnMsg) proceedingJoinPoint.proceed(); } catch (Throwable throwable) { log.error("ServiceExcepHandler serviceExcepHandler failed", throwable); returnMsg.setError(BaseErrorEnum.SYS_ERROR_UNKNOW); } return returnMsg; } }
使用時,在類或者方法上加上註解@ServiceExcepCatch
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Spring基礎之AOP的概念介紹
- SpringBoot使用Aspect切面攔截打印請求參數的示例代碼
- Spring AOP中三種增強方式的示例詳解
- springAop實現權限管理數據校驗操作日志的場景分析
- SpringAop日志找不到方法的處理