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