• Spring Boot 全局异常处理@ControllerAdvice


    Spring Boot 全局异常处理@ControllerAdvice

    Spring Boot 全局异常处理@ControllerAdvice

          在开发中出现异常后,可能需要一个统一处理的地方,来处理程序出现的异常,针对不同的异常做不同的处理,这里我们通过@ExceptionHandler注解来实现。在WEB开发中,比如页面出入进来日期,需要进行一些转换那么这里使用@InitBinder注解来处理。上面说的是一些使用场景,接下来具体如何实现。

    1.使用@ExceptionHandler当前Controller异常处理

          @ExceptionHandler可以使用在任何用@Controller注解修饰的类中,设置出现某种异常的时候执行,具体代码如下:
       (1)新建Controller,名称为:TestController,代码如下:
    1. package com.chengli.springboot.controller;
    2. import org.springframework.web.bind.annotation.ExceptionHandler;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import org.springframework.web.bind.annotation.RestController;
    5. import org.springframework.web.context.request.WebRequest;
    6. @RestController
    7. public class TestController {
    8. @RequestMapping(value = "/")
    9. public String hello() {
    10. throw new RuntimeException();
    11. }
    12. @ExceptionHandler(value = { RuntimeException.class })
    13. public String exception(Exception e, WebRequest webRequest) {
    14. return "出现异常了,在本类处理";
    15. }
    16. }

        (2)新建启动入口类,名称:MainConfig,具体代码如下:
    1. package com.chengli.springboot;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. @SpringBootApplication
    5. public class MainConfig {
    6. public static void main(String[] args) {
    7. SpringApplication.run(MainConfig.class, args);
    8. }
    9. }
        (3)运行启动,在浏览器输入后,会出现“出异常了,在本类处理”

    2.使用@ExceptionHandler全局异常处理

        (1)新建全局异常处理类,代码如下:
    1. package com.chengli.springboot.exception;
    2. import org.springframework.web.bind.annotation.ExceptionHandler;
    3. import org.springframework.web.bind.annotation.RestControllerAdvice;
    4. @RestControllerAdvice
    5. public class DefaultExceptionHandlerAdvice {
    6. @ExceptionHandler(value = { Exception.class })
    7. public String exception() {
    8. return "出异常了,全局异常处理";
    9. }
    10. }

        (2)这里需要提醒一点的是,优先级问题,同一种异常处理在本类的优先级要高,会优先使用本类的其次是全局的。所以我们这里需要将本类使用@ExceptionHandler的方法先注释掉,然后在浏览器上输入后,出现“出异常了,全局异常处理”。那么就OK啦。
          注意:这里我使用的是@RestControllerAdvice,@RestControllerAdvice是一个组合注解,组合了@ControllerAdvice、@ResponseBody,因为我这里是演示直接返回的是内容,所以为了方便使用@RestControllerAdvice,如果你们的异常需要返回页面啊之类的,你可以使用@ControllerAdvice分别定制。

    3.使用@InitBinder注解处理绑定值

        (1)添加initBinder方法,代码如下:
    1. @InitBinder
    2. public void initBinder(WebDataBinder binder) {
    3. binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
    4. @Override
    5. public void setAsText(String text) {
    6. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    7. try {
    8. setValue(format.parse(text));
    9. } catch (ParseException e) {
    10. e.printStackTrace();
    11. }
    12. }
    13. });
    14. }

        (2)上面的代码我是在处理参数的时候,将日期参数按照指定格式parse后在进行设置。@initBinder注解在很多场景下能用的上,比如你要处理字符串用来编码防止XSS攻击啊或者你要预先做个处理的都可以,这里就不细说了,@initBinder注解是可以放在所有使用了@Controller类中的,也可以放到全局类中,也就是说使用了@ControllerAdvice注解的类。
    https://blog.csdn.net/cl_andywin/article/details/53790510
  • 相关阅读:
    【转】从源码分析Handler的postDelayed为什么可以延时?
    android系统中如何通过程序打开某个AccessibilityService
    【转】在子线程中new Handler报错--Can't create handler inside thread that has not called Looper.prepare()
    【转】Android 增,删,改,查 通讯录中的联系人
    【转】Android调用Sqlite数据库时自动生成db-journal文件的原因
    【转】Android辅助功能AccessibilityService自动全选择文字粘贴模拟输入
    【转】Android中保持Service的存活
    Multi-label && Multi-label classification
    第2章 排序 || 第17节 三色排序练习题
    第2章 排序 || 第15节 有序数组合并练习题
  • 原文地址:https://www.cnblogs.com/sunny3158/p/16653607.html
Copyright © 2020-2023  润新知