【SpringBoot】AOP实现完美异常处理方案
迪丽瓦拉
2025-05-28 11:35:56
0次

一、页面类异常处理

之前章节给大家讲的都是接口类的异常处理,那我们做页面模板时,Controller发生异常我们该怎么办?应该统一跳转到404页面。
面临的问题:
程序员抛出自定义异常CustomException,全局异常处理截获之后返回@ResponseBody AjaxResponse,不是ModelAndView,所以我们无法跳转到error.html页面,那我们该如何做页面的全局的异常处理?
答:

  1. 用面向切面的方式,将CustomException转换为ModelAndViewException。
  2. 全局异常处理器拦截ModelAndViewException,返回ModelAndView,即error.html页面
  3. 切入点是带@ModelView注解的Controller层方法

使用这种方法处理页面类异常,程序员只需要在页面跳转的Controller上加@ModelView注解即可

错误的写法

@GetMapping("/freemarker")
public String index(Model model) {try{List articles = articleRestService.getAll();model.addAttribute("articles", articles);}catch (Exception e){return "error";}return "fremarkertemp";
}

正确的写法

@ModelView
@GetMapping("/freemarker")
public String index(Model model) {List articles = articleRestService.getAll();model.addAttribute("articles", articles);return "fremarkertemp";
}

二、用面向切面的方法处理页面全局异常

因为用到了面向切面编程,所以引入maven依赖包

        org.springframework.bootspring-boot-starter-aop

新定义一个异常类ModelViewException

public class ModelViewException extends RuntimeException{//异常错误编码private int code ;//异常信息private String message;public static ModelViewException transfer(CustomException e) {return new ModelViewException(e.getCode(),e.getMessage());}private ModelViewException(int code, String message){this.code = code;this.message = message;}int getCode() {return code;}@Overridepublic String getMessage() {return message;}}

ModelView 注解,只起到标注的作用

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})//只能在方法上使用此注解
public @interface ModelView {}

以@ModelView注解为切入点,面向切面编程,将CustomException转换为ModelViewException抛出。

@Aspect
@Component
@Slf4j
public class ModelViewAspect {//设置切入点:这里直接拦截被@ModelView注解的方法@Pointcut("@annotation(club.krislin.exception.ModelView)")public void pointcut() { }/*** 当有ModelView的注解的方法抛出异常的时候,做如下的处理*/@AfterThrowing(pointcut="pointcut()",throwing="e")public void afterThrowable(Throwable e) {log.error("切面发生了异常:", e);if(e instanceof  CustomException){throw ModelViewException.transfer((CustomException) e);}}
}

全局异常处理器:

@ExceptionHandler(ModelViewException.class)public ModelAndView viewExceptionHandler(HttpServletRequest req, ModelViewException e) {ModelAndView modelAndView = new ModelAndView();//将异常信息设置如modelAndViewmodelAndView.addObject("exception", e);modelAndView.addObject("url", req.getRequestURL());modelAndView.setViewName("error");//返回ModelAndViewreturn modelAndView;}

相关内容

热门资讯

亮眼数据盘点国庆假期蓬勃活力 ... 央视网消息:为期七天的国庆假期10月8日结束了,交通运输部表示,今年国庆假期人员流动量保持平稳,全社...
国庆假期家国同庆 河南文旅掀起... 大象新闻·河南交通广播记者:雷静 佑龙弦歌载庆,川原呈秀。2026年国庆假期,全省文化和旅游系统深入...
处处都是可感、可触、可参与的文... 来源:中国文化报本报记者集体采写国庆假期,全国处处涌动着文化科技热潮,各地花样翻新,推出“文旅+科技...
闪电评论 | 不负山海辽阔 金秋十月,山海辽阔,大地澎湃。长风从鲁西运河黄河岸边的县域市集,吹向省会城市潮流烟火街区,又掠过胶东...
旅游不只看风景了:年轻人开始“... 这个假期,年轻人旅游又整出了新花样:不光出去玩,还顺便报个课。数据显示,国庆期间,徒步、采摘、陶艺、...
兰州近郊轻徒步成国庆出游新风尚 金秋送爽,天朗气清。国庆假期,褪去了往年长途拥堵、景区扎堆的传统出游模式,兰州市民的过节方式悄然发生...
国庆假期河南重点景区共接待游客... “河南发布”消息,今年国庆假期,河南全省活动丰富、政策加力、场景焕新。重点监测零售企业累计实现销售额...
国庆假期中外旅游“双向奔赴”   新华社北京10月7日电 2026年国庆假期,中国游客走出国门,欣赏远方的风景;而外国游客从世界各...
长假尾声 游兴不减 10月7日,游客在浙江杭州西湖风景区游览。 新华社记者 徐昱 摄  国庆长假进入尾声,人们赏美景,品...
这座晋南古镇,在保护与烟火中复...   新华社太原10月7日电(记者邓浩然)“这有什么看头?”自幼在山西襄汾汾城长大的郑彦文,曾经面对汹...