查看: 254|回复: 0

[Java学习] Spring Boot中使用AOP统一处理web层异常的方法

发表于 2018-4-15 08:00:01

在springboot错误默认是跳转到 请求返回渲染路径中的error/错误页面中。

源码分析:DefaultErrorViewResolver.java

  1. private ModelAndView resolve(String viewName, Map<String, Object> model) {
  2. String errorViewName = "error/" + viewName;
  3. TemplateAvailabilityProvider provider = this.templateAvailabilityProviders
  4. .getProvider(errorViewName, this.applicationContext);
  5. if (provider != null) {
  6. return new ModelAndView(errorViewName, model);
  7. }
  8. return resolveResource(errorViewName, model);
  9. }
复制代码

比如在application.properites中配置渲染页面为

  1. #配置freemaker
  2. spring.freemarker.template-loader-path=/WEB-INF/
复制代码

如果不配置spring.freemarker.template-loader-path,springboot会在src/main/resources中的templates中的error文件下下找错误渲染的页面。

那么当出现错误时,系统会跳转到/WEB-INF/error/错误页面中。

使用AOP进行web层异常处理

  1. package com.niugang.aop;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServletRequest;
  5. import org.aspectj.lang.annotation.AfterThrowing;
  6. import org.aspectj.lang.annotation.Aspect;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import org.springframework.stereotype.Component;
  10. import org.springframework.web.context.request.RequestAttributes;
  11. import org.springframework.web.context.request.RequestContextHolder;
  12. import org.springframework.web.context.request.ServletRequestAttributes;
  13. import org.springframework.web.servlet.ModelAndView;
  14. /**
  15. * controller层统一异常处理
  16. *
  17. * @author niugang
  18. *
  19. */
  20. @Aspect
  21. @Component
  22. public class ExceptionControllerAscept {
  23. private Logger logger = LoggerFactory.getLogger(ExceptionControllerAscept.class);
  24. /**
  25. * 匿名切点的方式
  26. *
  27. * @param ex
  28. * @throws ServletException
  29. * @throws IOException
  30. */
  31. @AfterThrowing(value = "execution(public * com.niugang.controller..*.*(..))", throwing = "ex")
  32. public ModelAndView aroundAdvice(Exception ex) throws ServletException, IOException {
  33. ModelAndView modelAndView = new ModelAndView();
  34. RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
  35. ServletRequestAttributes r = (ServletRequestAttributes) requestAttributes;
  36. HttpServletRequest request = r.getRequest();
  37. modelAndView.setViewName("500");
  38. // 第一如果是 RuntimeException
  39. if (ex instanceof RuntimeException) {
  40. logger.error("抛出运行时异常{}", ex.getMessage());
  41. modelAndView.addObject("exception", ex.getMessage());
  42. // 跳转到错误页面
  43. modelAndView.addObject("url", request.getRequestURL());
  44. return modelAndView;
  45. }
  46. modelAndView.addObject("exception","未知异常");
  47. return modelAndView;
  48. }
  49. }
复制代码

总结

以上所述是小编给大家介绍的Spring Boot中使用AOP统一处理web层异常,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对程序员之家网站的支持!



回复

使用道具 举报