异常统一处理[ExceptionAdvice](SpringMVC)

ExceptionAdvice

ExceptionAdvice可以批量为多个controller统一增加异常处理和InitBinder

ExceptionAdvice
通过@ExceptionHandler注解决定此方法处理哪种异常,
以及对异常进行的处理方式.
通过@InitBinder注解给controller绑定一个时间转换器

例:

import org.springframework.format.datetime.DateFormatter;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.sql.SQLException;
import java.util.Collections;
import java.util.Map;

/*
* ControllerAdvice 统一处理器
*
* 可以批量为多个controller统一增加异常处理和InitBinder
* */
// 批量为某些包下的controller增加功能
//@ControllerAdvice(basePackages = {"com.lanou.demo.controller"})
// 如果所有controller都在同一个包下
//@ControllerAdvice({"com.lanou.demo.controller"})
// 指定为某些controller增加功能
//@ControllerAdvice(assignableTypes = {DataController.class})
// 指定为某个类所在的包下的所有controller增加功能
//@ControllerAdvice(basePackageClasses = {BookController.class})
// 为哪些注解所标记的controller增加功能
@ControllerAdvice(annotations = {Controller.class, RestController.class})

// 与@RestController意义是一样的, 都是将此类中的方法加上@ResponseBody
// @RestControllerAdvice
public class SqlExceptionAdvice {
    /*
     * 在某个controller中使用ExceptionHandler
     * 可以处理当前controller中抛出的异常
     * 这个规则与controller中的其他方法和规则是一样的
     *
     * 这个ExceptionHandler方法可以写多个, 针对不同类型的异常做不同的处理,
     * 方法的参数中可以增加一个异常对象用来获取捕获到的异常对象
     * */
    @ExceptionHandler(SQLException.class)
    public String error(Model model, SQLException ex){
        model.addAttribute("message",ex.getMessage());
        return "error";
    }

    @ExceptionHandler(IOException.class)
    @ResponseBody
    public Map<String,Object> errorJson(IOException ex){
        return Collections.singletonMap("message",ex.getMessage());
    }

    @InitBinder
    public void initBinder(WebDataBinder binder){
        // 可以为当前的controller绑定一个时间格式转换器
        binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
    }
}

步骤:

创建一个advice包, 用于存放异常统一处理的类

在advice包中, 创建一个ExceptionAdvice

ExceptionAdvice类中创建方法用于对异常进行捕获与处理


全局异常处理机制


package com.jt.advice;

import com.jt.vo.SysResult;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * Spring为了整合全局异常的处理  开发了如下的注解
 *  1.@RestControllerAdvice //定义全局异常的处理类 返回值JSON串
 *  2.@ExceptionHandler     标识拦截的异常的类型,如果类型匹配,则执行方法
 */
@RestControllerAdvice
public class MyExceptionAdvice {

    //写法:1.运行时异常(通用)  2.自定义异常信息  3.拦截所有异常Exception.class
    @ExceptionHandler(RuntimeException.class)
    public Object exception(Exception e){
        e.printStackTrace();    //输出异常信息
        //需求: 如果遇到异常,应该提示用户201/失败信息.
        return SysResult.fail();
    }
}

版权声明:本文为abcd741258358原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。