自定义注解和springAOP捕获Service层异常,并处理自定义异常操作
作者:侯赛雷
这篇文章主要介绍了自定义注解和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
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。