项目出现这个问题。本来全局异常捕获好好的。只要抛出自己写的自定义异常就会传给前端。但我加入了环绕通知后,发现全局异常失效了。
来看看我的全局异常
package com.yiban.suoai.exception;
import com.yiban.suoai.exception.SAException;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
// 统一的异常类进行处理(把默认的异常返回信息改成自定义的异常返回信息)
// SAException,将自动找到此类中对应的方法执行,并返回json数据给前台
@ControllerAdvice
public class ExceptionController {
@ResponseBody
@ExceptionHandler(value = SAException.class) //异常处理器,SAException
public Map<String, Object> hanlerException(HttpServletRequest request, SAException e){
Map<String, Object> map=new HashMap<>();
map.put("message",e.getMessage());
map.put("error",e.getErrorCode());
map.put("ErrorCode",e.getCode());
return map;
}
}
先了解下通知
通知(Advice):在AOP中,切面的工作被称为通知。通知定义了切面“是什么”以及“何时”使用。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题。
Spring切面可以应用5种类型的通知:
- 前置通知(Before):在目标方法被调用之前调用通知功能
- 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么
- 返回通知(After-returning):在目标方法成功执行之后调用通知
- 异常通知(After-throwing):在目标方法抛出异常后调用通知
- 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行
环绕通知是最为强大的。他包括了上面的所有通知,也就包括了异常通知。
我就想,可能我的异常被环绕通知给捕获了。
看下环绕通知代码
@Around("logAop() && args(email)")
public void logAround(ProceedingJoinPoint jp, String email) {
try {
logger.debug("自定义前置通知Before>>>{}", email);
jp.proceed();//将控制权交给被通知的方法,也就是执行sayHello方法
logger.debug("自定义返回通知AfterReturning>>>{}", email);
} catch (Throwable throwable) {
logger.debug("异常处理>>>>{}", email);
throwable.printStackTrace();
}
logger.debug("自定义后置通知After>>>{}", email);
}
看到 原来异常真的被catch到了
那就简单了,直接在这里抛出异常
catch (Throwable throwable) { throw throwable; }
问题完美解决