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]
执行代码并在浏览器访问
赞 (0)