使用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层代码就完事了,
## 监测结果
我就把日志打印截个图吧
正常执行:

发生异常:(我这里人为添加个异常)

## ==完事!希望萍萍妹妹今天很开心==