目录
大无语事件!因为我先写了AOP的代码,然后测试统一异常处理!我在AOP中对异常进行了捕获,所以!!!!!!统一异常处理一直失效!
AOP
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
配置
@Aspect
@Component
public class DosomethingAop {
/**
* 切入点,写为方法主要以便后边引入
*/
@Pointcut("execution(public * com.lt.druid.controller.*Controller.*(..))")
public void dosomething() {
}
//方法执行前执行
@Before("dosomething()")
public void doBefore(){
System.out.println("执行before");
}
//方法执行后执行
@After("dosomething()")
public void doAfter(){
System.out.println("执行after");
}
//环绕通知
@Around("dosomething()")
public Object around(ProceedingJoinPoint point) {
System.out.println("方法执行前");
Object result = null;
try {
// 执行方法
result = point.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
// 执行时长(毫秒)
// 保存日志
System.out.println("方法执行后");
return result;
}
测试
方法执行前
执行before
{dataSource-1} inited
==> Preparing: select * from tags
==> Parameters:
<== Total: 15
执行after
方法执行后
总结
aop对方法进行增强!接下来你就可以对自己想要增强的方法前后进行处理。或许是记录日志?或许是数据处理?
@RestControllerAdvice
返回给前端的数据格式统一,方便处理!先把上边aop中环绕通知给注释了。
自定义handler
//全局异常捕捉处理
@RestControllerAdvice
public class CustomExceptionHandler {
@ExceptionHandler(value = Exception.class)
public Map errorHandler(Exception ex) {
//自定义返回格式
Map map = new HashMap();
map.put("code", 400);
if(ex instanceof MyException){
map.put("msg",((MyException) ex).getMsg());
}
return map;
}
}
自定义异常
@Data
public class MyException extends RuntimeException {
private int code;
private String msg;
public MyException(int code, String msg){
super(msg);
this.code = code;
this.msg = msg;
}
public MyException(String msg){
super(msg);
this.msg = msg;
}
}
测试
@RequestMapping(value = "testException",method = RequestMethod.GET)
public void doException(){
throw new MyException("自定义");
}
注解无效
- aop中处理异常,controller没有抛出
- spring没把它注册进容器,需要指定包扫描
- (未尝试)在使用的controller类上继承写的handler类
- (未尝试)在handler上加上@Primary(1)