AOP处理页面跳转异常

在上一节,我们讲解的是利用JSON的数据接口,给前端相应数据的方式进行页面跳转异常处理。这种方式通常用于前后端分离开发的应用。如果controller层的开发使用的是JSP或者是freemarker模版进行跳转。

对于这种异常我们该如何处理呢?(例如我们之前编写的templateController.java中使用过的模版,抛出的自定义异常都会被异常处理的方法拦截掉,响应ExceptionResponse,它就跳转不到errpr.html页面上了)

如果页面跳转方式的controller中发生异常的话我们会统一跳转到一个error.html页面。为了达到这样的处理效果,代码通常的写法是:

@GetMapping("/freemarker")public String index(Model model) { try {
  List<PetsVO> pets = petsRestService.getAll();
  model.addAttribute("pets", pets);
 } catch (Exception e) {  return "error";
 } return "fremarkertemp";
}12345678910复制代码类型:[java]

这种写法的效果不好,需要在每一个controller里面写try...catch...我们希望能把这一部分的代码排除掉。

页面跳转异常处理

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

由于用到了面向切面编程,所以需要引入maven依赖:

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-aop</artifactId>
</dependency>1234复制代码类型:[java]

首先来编写一个自定义注解 CustomizationView

把它放在exception文件下:

package com.javafamily.familydemo.exception;import java.lang.annotation.*;// 为注解添加的注解@Documented// 这个注解是在运行时使用的@Retention(RetentionPolicy.RUNTIME)// @CustomizationView注解只能在方法上使用@Target({ElementType.METHOD})// 注解只起标注作用,所以不包含任何逻辑public @interface CustomizationView {
}12345678910111213复制代码类型:[java]

为了让注解相关的内容实现逻辑,在exception文件夹下创建CustomizationViewAspect.java并编写一个面向切面编程的内容:

package com.javafamily.familydemo.exception;import org.aspectj.lang.annotation.AfterThrowing;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;// 当前类为面向切面编程的类@Aspect// 实例化面向切面编程的主键@Componentpublic class CustomizationViewAspect { // 设置切入点:这里直接拦截被@CustomizationView注解的方法
 @Pointcut("@annotation(com.javafamily.familydemo.exception.CustomizationView)")
 public void pointcut() {
 } // 当有CustomizationView的注解的方法抛出异常的时候,做如下的处理
 @AfterThrowing(pointcut = "pointcut()", throwing = "e")
 public void afterThrowable(Throwable e) {  throw CustomizationViewException.transfer(e);
 }
}123456789101112131415161718192021222324复制代码类型:[java]

自定义一个异常类CustomizationViewException

package com.javafamily.familydemo.exception;public class CustomizationViewException extends RuntimeException { // 将所有其他的异常转换为 CustomizationViewException
 public static CustomizationViewException transfer(Throwable cause) {  return new CustomizationViewException(cause);
 } private CustomizationViewException(Throwable cause) {  super(cause);
 }
}12345678910111213复制代码类型:[java]

找到全局异常处理器,把异常界面定位到error.ftl:

@ExceptionHandler(CustomizationViewException.class)
 public ModelAndView viewExceptionHandler(HttpServletRequest req, CustomizationViewException e) {
  ModelAndView modelAndView = new ModelAndView();  // 将异常信息设置如modelAndView
  modelAndView.addObject("exception", e);
  modelAndView.addObject("url", req.getRequestURL());
  modelAndView.setViewName("error");  // 返回ModelAndView
  return modelAndView;
 }123456789101112复制代码类型:[java]

最后写一个error页面,因为之前使用了freemarker模板,所以在resources.templates下创建errot.ftl:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>error.ftl</title>
</head>
<body>
<h1 style="color: green;">exception.toString()</h1>
<div style="color: red;">${exception.toString()}</div>

<h1 style="color: green;">exception.message</h1>
<div style="color: red;">${exception.message}</div>

<h1 style="color: green;">url</h1>
<div style="color: red;">${url}</div>
</body>
</html>123456789101112131415161718复制代码类型:[java]

记得在TemplateController.java中使用自定义注解并抛出一个异常:

package com.javafamily.familydemo.controller;import com.javafamily.familydemo.exception.CustomizationView;import com.javafamily.familydemo.exception.PetsException;import com.javafamily.familydemo.exception.PetsExceptionType;import com.javafamily.familydemo.model.PetsVO;import com.javafamily.familydemo.service.PetsService;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import javax.annotation.Resource;import java.util.List;@Controller@RequestMapping("/template")public class TemplateController { @Resource
 PetsService petsService; @CustomizationView
 @GetMapping("/freemarker")
 public String index(Model model) {  if (1 == 1) {   throw new PetsException(PetsExceptionType.SYSTEM_ERROR);
  }

  List<PetsVO> pets = petsService.getAll();

  model.addAttribute("pets", pets);  return "freemarker";
 }
}123456789101112131415161718192021222324252627282930313233343536373839复制代码类型:[java]

执行代码并在浏览器访问

http://localhost:8888/template/freemarker:

(0)

相关推荐