使用AOP面向切面开发统一异常监测

使用AOP做项目统一异常监测

我这里使用的是com.alibaba.fastjson.JSONObject数据类型将异常结果和正常响应结果封装响应给前台的!

tip:=一定要保证切面的返回值类型和你要增强的方法(即:controller层返回的数据类型)一致,不然会报数据强转错误!!!

前边一是指定好了返回给前端的数据类型是:com.alibaba.fastjson.JSONObject(controller层返回值类型)

那我们就上AOP代码吧

闹它!!!
看代码和注解就能够明白代码都干了那些事
···
import com.alibaba.fastjson.JSONObject;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component //交给ioc管理
@Aspect//表明当前类是切面增强类
public class ResultAspect {

public static final Logger logger = LoggerFactory.getLogger(ResultAspect.class);

//环绕切面
//execution(* com.jiuqi.ais.tocc_ais.controller.*.*(..))里的为正则表达式的通用写法,
// 第一个 * 为返回值类型,我这里用* 表示任意类型
// 全限定路径后.*.*表示controller包下的任何类任何方法
// (..)表示传入的参数是:任意类型,任意个数
@Around("execution(* com.kangaroo.controller.*.*(..))")
public JSONObject handleControllerMethod(ProceedingJoinPoint pjp) {
    JSONObject jsonObject = new JSONObject();
    try {
        logger.info("执行Controller开始: " + pjp.getSignature() + " 参数:" + pjp.getArgs());

        //执行具体的方法
        Object object = pjp.proceed(pjp.getArgs());
        logger.info("执行Controller结束: " + pjp.getSignature() + ", 返回值:" + object.toString());
        jsonObject.put("status",2000);
        jsonObject.put("message","响应成功");
        if(object instanceof JSONObject){
            if(((JSONObject) object).containsKey("JsonArrayOfController")){
                jsonObject.put("dataInput", ((JSONObject) object).getJSONArray("JsonArrayOfController"));
            }else {
                jsonObject.put("dataInput", object);
            }
        }else {
            jsonObject.put("dataInput", object);
        }
    } catch (Throwable throwable) {
        jsonObject = handlerException(pjp, throwable);
    }
    return jsonObject;
}

/**
 * controller层出现异常时,处理异常的方法
 * 注意:异常是可以向上传递的,所以项目中必要的异常千万不要try...catch...,要抛给上一层,最后就都抛给controller层了
 *  然后被aop切面增强获取,处理异常
 */
public JSONObject handlerException(ProceedingJoinPoint pjp, Throwable e) {
    JSONObject jsonObject = new JSONObject();
    if(e.getClass().isAssignableFrom(TOCCResult.class) ){
        TOCCResult toccResult = (TOCCResult)e;
        jsonObject = JSONObject.parseObject(toccResult.toString());
        logger.error("TOCCException{方法:" + pjp.getSignature() + ", 参数:" + pjp.getArgs() + ",异常:" +  toccResult.toString());
    } else if (e instanceof RuntimeException) {
        logger.error("RuntimeException{方法:" + pjp.getSignature() + ", 参数:" + pjp.getArgs() + ",异常:" + e.getMessage() + "}", e);
        jsonObject.put("status",5000);
        jsonObject.put("message",e.toString());
        jsonObject.put("dataInput","");
    } else {
        logger.error("异常{方法:" + pjp.getSignature() + ", 参数:" + pjp.getArgs() + ",异常:" + e.getMessage() + "}", e);
        jsonObject.put("status",4000);
        jsonObject.put("message",e.toString());
        jsonObject.put("dataInput","");
    }
    return jsonObject;
  }
  }
正常编写controller层代码就完事了,
## 监测结果
我就把日志打印截个图吧
正常执行:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200422105029745.png)
发生异常:(我这里人为添加个异常)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200422105911897.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/2020042211020778.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTAxNTA5NA==,size_16,color_FFFFFF,t_70)
## ==完事!希望萍萍妹妹今天很开心==
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值