自定义注解和springAOP捕获Service层异常,并处理自定义异常操作

 更新时间:2021年06月07日 11:27:39   作者:侯赛雷  
这篇文章主要介绍了自定义注解和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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Springmvc 4.x利用@ResponseBody返回Json数据的方法

    Springmvc 4.x利用@ResponseBody返回Json数据的方法

    这篇文章主要介绍了Springmvc 4.x利用@ResponseBody返回Json数据的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Java分页查询--分页显示(实例讲解)

    Java分页查询--分页显示(实例讲解)

    下面小编就为大家带来一篇Java分页查询--分页显示(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • java1.8安装及环境变量配置教程

    java1.8安装及环境变量配置教程

    这篇文章主要介绍了java1.8安装及环境变量配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Java有趣好玩的图形界面开发八个案例实现

    Java有趣好玩的图形界面开发八个案例实现

    今天使用GUI技术写了几个练习的Demo,希望对大家学习图形用户界面有所帮助,感兴趣的同学来看看吧,动手敲一遍理解更通透
    2022-05-05
  • SpringBoot动态生成接口实现流程示例讲解

    SpringBoot动态生成接口实现流程示例讲解

    最近遇到一个需求,需要在程序运行过程中,可以动态新增接口,自定义接口参数名称,基本类型,以及请求方法,请求头等等。通过几天的研究,找到了我需要的解决方案
    2023-01-01
  • Mybatis联合查询的实现方法

    Mybatis联合查询的实现方法

    本文主要介绍了 Mybatis联合查询的实现方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Java中实现分布式定时任务的方法

    Java中实现分布式定时任务的方法

    这篇文章主要介绍了Java中实现分布式定时任务,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Java-JFrame-swing嵌套浏览器的具体步骤

    Java-JFrame-swing嵌套浏览器的具体步骤

    下面小编就为大家带来一篇Java-JFrame-swing嵌套浏览器的具体步骤。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • java计算两个日期中间的时间

    java计算两个日期中间的时间

    这篇文章主要介绍了java计算两个日期中间的时间的相关资料,需要的朋友可以参考下
    2017-04-04
  • SWT(JFace)体验之Slider,Scale

    SWT(JFace)体验之Slider,Scale

    SWT(JFace)体验之Slider,Scale实现代码。
    2009-06-06

最新评论