自定义注解和springAOP捕获Service层异常,并处理自定义异常操作
作者:侯赛雷 发布时间:2023-04-04 05:26:04
标签:注解,springAOPService,异常
一 自定义异常
/**
* 自定义参数为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
来源:https://www.cnblogs.com/houzheng/p/11953183.html


猜你喜欢
- 本文实例为大家分享了java使用influxDB数据库的具体代码,供大家参考,具体内容如下1.pom.xml中导入jar包依赖<!--
- 一. 可变字符串1. 简介在Java中,我们除了可以通过String类创建和处理字符串之外,还可以使用StringBuffer和String
- 先看一下效果图Tinker已知问题由于原理与系统限制,Tinker有以下已知问题:Tinker不支持修改AndroidManifest.xm
- 缓存,我相信大家对它一定不陌生,在项目中,缓存肯定是必不可少的。市面上有非常多的缓存工具,比如 Redis、Guava Cache 或者 E
- 本文实例为大家分享了java实现简单俄罗斯方块的具体代码,供大家参考,具体内容如下结合网上的资料刚做完课程设计,具体代码如下:public
- 类和结构的区别:1.一个是引用类型一个是值类型Class是引用类型,继承自System.Object类Struct是值类型,继承自Syste
- 这篇文章首先介绍了在SpringBoot中如何获得项目的编译时间和版本号,并向外提供接口,然后介绍了介绍了新版maven获得时间戳时区错误的
- 这篇文章主要介绍了spring cloud gateway网关路由分配代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有
- 本文实例为大家分享了Android霓虹闪烁文字效果的具体代码,供大家参考,具体内容如下package com.example.apple.s
- maven配置阿里云镜像打开maven配置文件,找到标签,添加如下:<mirrors> <mirror>
- 目录例1: 以下代码输出什么?例2: 为什么虚函数效率低?虚继承例3: 请评价多重继承的优点和缺陷。例4: 在多继承的时候,如果一个类继承同
- C++ 中const修饰虚函数实例详解【1】程序1#include <iostream>using namespace std;
- 本文实例讲述了Android开发中Activity之间切换出现短暂黑屏的解决方法。分享给大家供大家参考,具体如下:在默认情况下,Androi
- 要爬取一个网站遇到了极验的验证码,这周都在想着怎么破解这个,网上搜了好多知乎上看到有人问了这问题,我按照这思路去大概实现了一下。1.使用ht
- 在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件
- 60年代,在OS中能拥有资源和独立运行的基本单位是进程,然而随着计
- Java基础 Servlet * 详解 1 概念:Servlet * ,用来监听web容器的一些对象状态的变化,主要是Servle
- java.util.Scanner类是一个简单的文本扫描类,它可以解析基本数据类型和字符串。它本质上是使用正则表达式去读取不同的数据类型。J
- 1. 算法分析根据概率将奖品划分区间,每个区间代表一个奖品,然后抽取 随机数,反查落在那个区间上,即为所抽取的奖品。2. 代码核心
- SpringCloud简介Spring cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务的微