- 使用@ControllerAdvice(annotations = Controller.class)注解
@ControllerAdvice(annotations = Controller.class)
public class ExceptionAdvice {
private static final Logger logger = LoggerFactory.getLogger(ExceptionAdvice.class);
@ExceptionHandler({Exception.class}) //controller发生异常之后调用,用来指定异常的类型,这里代表所有异常
public void handleException(Exception e, HttpServletRequest request, HttpServletResponse response) throws IOException {
logger.error("服务器发生异常:",e.getMessage());
for(StackTraceElement element : e.getStackTrace()){ //e.getStackTrace()是一个数组,里面存了StackTraceElement对象
logger.error(element.toString());
}
String xRequestedWith = request.getHeader("x-requested-with"); //得到请求的方式,普通的或异步的
if ("XMLHttpRequest".equals(xRequestedWith)) { //代表异步请求,返回xml,json···
response.setContentType("application/plain;charset=utf-8");//向浏览器返回普通字符串,application/json则向浏览器返回json数据
PrintWriter writer = response.getWriter();
writer.write(CommunityUtil.getJsonString(1,"服务器异常"));
} else {
response.sendRedirect(request.getContextPath() + "/error"); //普通请求则重定向到错误页面
}
}
}
追踪注解源码可看出ControllerAdvice也是一个Component,所以容器会帮我们加载这个组件