zoukankan      html  css  js  c++  java
  • SpringBoot @ControllerAdvice的使用详解1(全局异常处理 @ExceptionHandler)

     顾名思义,@ControllerAdvice 就是 @Controller 的增强版。@ControllerAdvice 主要用来处理全局数据,一般搭配 @ExceptionHandler、@ModelAttribute、@InitBinder 使用。下面分别进行介绍。

    一、全局异常处理(搭配 @ExceptionHandler)

    1,基本用法

    (1)@ControllerAdvice 最常见的使用场景就是全局异常处理。假设我们项目中有个文件上传功能,并且对文件上传的大小限制进行了配置。

    上传页面和整合请参考上一篇。

    (2)如果用户上传的文件超过了限制大小,就会抛出异常,此时可以通过 @ControllerAdvice 结合 @ExceptionHandler 定义全局异常捕获机制,具体代码如下:

    代码说明:
    CustomExceptionHandler 类上面添加了 @ControllerAdvice 注解。当系统启动时,该类就会被扫描到 Spring 容器中。
    uploadException 方法上面添加了 @ExceptionHandler 注解,其中定义的 MaxUploadSizeExceededException.class 表明该方法用来处理 MaxUploadSizeExceededException 类型的异常。如果想让该方法处理所有类型的异常,只需要将 MaxUploadSizeExceededException 改成 Exception 即可。
    异常处理方法的参数可以有异常实例、HttpServletResponse 以及 HttpServletRequest、Model 等。 异常处理方法的返回值可以是一段 JSON、一个 ModelAndView、一个逻辑视图名等。

    (3)这时当我们上传一个超大文件,页面上就会显示一个错误提示。访问http://localhost:8080/upload.html

     

    2,返回一个 ModelAndView

    (1)下面使用一个返回参数是 ModelAndView 的样例。这里我们使用的页面模版为 Thymeleaf,所以首先要在 pom.xml 中添加相关依赖。
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

    (2)接着对上面异常处理方法进行修改:

    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.multipart.MaxUploadSizeExceededException;
    import org.springframework.web.servlet.ModelAndView;
     
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
     
    @ControllerAdvice
    public class CustomExceptionHandler {
        @ExceptionHandler(MaxUploadSizeExceededException.class)
        public ModelAndView uploadException(MaxUploadSizeExceededException e, HttpServletResponse resp)
                throws IOException {
            ModelAndView mv = new ModelAndView();
            mv.addObject("msg", "上传文件超出限制!");
            mv.setViewName("error");
            return mv;
        }
    }
     (3)然后在 resources/templates 目录下创建 error.html 文件,内容如下:
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div th:text="${msg}"></div>
    </body>
    </html>

    (4)同样上传一个超大文件,页面上就会显示一个错误提示:

    早年同窗始相知,三载瞬逝情却萌。年少不知愁滋味,犹读红豆生南国。别离方知相思苦,心田红豆根以生。
  • 相关阅读:
    进制
    流程控制
    运算符
    格式化输出
    数据结构-树的遍历
    A1004 Counting Leaves (30分)
    A1106 Lowest Price in Supply Chain (25分)
    A1094 The Largest Generation (25分)
    A1090 Highest Price in Supply Chain (25分)
    A1079 Total Sales of Supply Chain (25分)
  • 原文地址:https://www.cnblogs.com/shanheyongmu/p/15688672.html
Copyright © 2011-2022 走看看