java利用弹簧注解实现处理异常AOP

  

java利用弹簧注解实现处理异常AOP ?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

项目刚刚开发的时候,并没有做好充足的准备。开发到一定程度的时候才会想到还有一些问题没有解决。就比如今天我要说的一个问题:异常的处理。写程序的时候一般都会通过try…catch……最后对异常进行处理,但是我们真的能在写程序的时候处理掉所有可能发生的异常吗?以及发生异常的时候执行什么逻辑,返回什么提示信息,跳转到什么页面,这些都是要考虑到的。


@ControllerAdvice注解内部使用@ExceptionHandler, @InitBinder, @ModelAttribute注解的方法应用到所有的@RequestMapping注解的方法。本例子中使用ExceptionHandler应用到所有@RequestMapping注解的方法,处理发生的异常。

示例代码:

进口org.slf4j.Logger;
  进口org.slf4j.LoggerFactory;
  进口org.springframework.http.HttpHeaders;
  进口org.springframework.http.HttpStatus;
  进口org.springframework.http.ResponseEntity;
  进口org.springframework.util.StringUtils;
  进口org.springframework.web.bind.annotation.ControllerAdvice;
  进口org.springframework.web.bind.annotation.ExceptionHandler;
  进口org.springframework.web.bind.annotation.ResponseBody;
  
  进口com.hjz.exception.ServiceException;
  进口com.hjz.exception.utils.ExceptionUtils;
  
  @ResponseBody
  公开课ExceptionAdvice {
  私有静态最终日志记录器=LoggerFactory.getLogger (ExceptionAdvice.class);/* *
  *拦截web层异常,记录异常日志,并返回友好信息到前端
  *目前只拦截例外,是否要拦截错误需再做考虑
  *
  * @param e异常对象
  * @return异常提示
  */@ExceptionHandler (Exception.class)
  公共ResponseEntityhandleException(异常e) {//不需要再记录ServiceException,因为在服务异常切面中已经记录过
  如果(!(e instanceof ServiceException)) {
  LOGGER.error (ExceptionUtils.getExcTrace (e));
  }
  
  HttpHeaders header=new HttpHeaders ();
  headers.set (“Content-type",“文本/平原;charset=UTF-8");
  headers.add (“icop-content-type",“exception");
  字符串消息=StringUtils.isEmpty (e.getMessage ()), # 63;“系统异常! !“:e.getMessage ();
  返回新ResponseEntity<祝辞(消息、标题HttpStatus.OK);
  }
  }

如果不起作用,请检查spring mvc的配置文件,是否有ControllerAdvice的如下配置

& lt;上下文:component-scan基础包=癱om.sishuok.es"use-default-filters=癴alse"比;   & lt;上下文:include-filter类型=癮nnotation"表达=皁rg.springframework.stereotype.Controller"/比;   & lt;上下文:include-filter类型=癮nnotation"表达=皁rg.springframework.web.bind.annotation.ControllerAdvice"/比;   & lt;/背景:component-scan>

1。处理控制器层的异常WebExceptionAspect。java

进口org.aspectj.lang.annotation.AfterThrowing;   进口org.aspectj.lang.annotation.Aspect;   进口org.aspectj.lang.annotation.Pointcut;   进口org.slf4j.Logger;   进口org.slf4j.LoggerFactory;   进口org.springframework.stereotype.Component;   进口org.springframework.util.StringUtils;   进口org.springframework.web.context.request.RequestContextHolder;   进口org.springframework.web.context.request.ServletRequestAttributes;      进口com.hjz.exception.ServiceException;   进口com.hjz.exception.utils.ExceptionUtils;      进口javax.servlet.http.HttpServletResponse;   进口java.io.IOException;   进口java.io.PrintWriter;/* *   *网络异常切面   spring aop不*默认会拦截控制器层,使用该类需要在春天公共配置文件中注入改豆,   *另外需要配置& lt; aop: aspectj-autoproxy proxy-target-class=皌rue"/比;   */@Aspect   公开课WebExceptionAspect {   私有静态最终日志记录器=LoggerFactory.getLogger (WebExceptionAspect.class);      @Pointcut (“@annotation (org.springframework.web.bind.annotation.RequestMapping)“)   私人空间webPointcut () {}/* *   *拦截web层异常,记录异常日志,并返回友好信息到前端   *目前只拦截例外,是否要拦截错误需再做考虑   *   * @param e异常对象   */@AfterThrowing(切入点=皐ebPointcut()“,把=癳")   公共空间handleThrowing(异常e) {//不需要再记录ServiceException,因为在服务异常切面中已经记录过   如果(!(e instanceof ServiceException)) {   LOGGER.error (ExceptionUtils.getExcTrace (e));   }      字符串errorMsg=StringUtils.isEmpty (e.getMessage ()), # 63;“系统异常“;:e.getMessage ();   writeContent (errorMsg);   }/* *   *将内容输出到浏览器   *   * @param内容输出内容   */私人空间writeContent(字符串内容){   HttpServletResponse响应=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes ()) .getResponse ();   response.reset ();   response.setCharacterEncoding (“UTF-8");   response.setHeader (“Content-Type",“文本/平原;charset=UTF-8");   response.setHeader (“icop-content-type",“exception");   PrintWriter作家=零;   尝试{   作家=response.getWriter ();   }捕捉(IOException e) {   e.printStackTrace ();   }   writer.print(内容);   writer.flush ();   writer.close ();   }   }

java利用弹簧注解实现处理异常AOP