文章目录
- 一、全局异常处理器
 - 1.1 程序
 - 1.2 @ControllerAdvice 注解
 
- 二、封装结果集
 
一、全局异常处理器
- 各层代码出现异常,我们是如何处理的?
 
 未做处理。
 如果是在Mapper层出现异常,会抛给Service,Service会抛给Controller,Controller最终会返回给框架,框架会响应一串JSON数据,里面封装的错误的信息,但是框架封装的JSON数据并不符合我们的开发规范

- 出现异常,该怎么处理?
 
 方案一:在Controller方法中进行try…catch处理
 方案二: 全局异常处理器。 Controller抛出的异常没有处理,最终会抛给全局异常处理器处理,处理完后再给浏览器响应统一处理结果集。

@RestControllerAdvice = @ControllerAdvice + @ResponseBody
所以在全局异常处理器中的返回结果还是JSON数据
1.1 程序
/**
 * 全局异常处理
 * 底层是通过代理,代理controller,通过AOP把我们的一些方法拦截到,如果有异常,就在这个类统一进行处理
 * 下面就是只要带有RestController.class, Controller.class,Service.class的注解的类或方法出现异常,我们都会进行统一处理
 */
@ControllerAdvice(annotations = {RestController.class, Controller.class, Service.class})  // 通知
@ResponseBody  //我们需要返回JSON数据
@Slf4j
public class GlobalExceptionHandler {
//  表示处理SQL异常
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex) {
//      打印日志信息
        log.error(ex.getMessage());//Duplicate entry 'zhangjingqi' for key 'employee.idx_username'
//      在这里也可以判断异常的具体信息,比如:
        if(ex.getMessage().contains("Duplicate entry")){
            String[] s = ex.getMessage().split(" ");
            String username = s[2];
            String msg =s[2]+"已经存在";
           return   R.error(msg);
        }
//      其他情况下可以直接输出
        return R.error("未知错误:"+ex.getMessage());
    }
}
 
/**
 *  全局异常处理器
 */
@RestControllerAdvice
public class GlobalExceptionHandler {
//  指定捕获哪一个类型的异常
    @ExceptionHandler(Exception.class)  //捕获所有异常
    public Result ex(Exception ex){
         ex.printStackTrace();// 打印堆栈信息
        return Result.error("对不起,操作失败");
    }
    
}
 
1.2 @ControllerAdvice 注解
称为Controller增强器,给Controller控制器添加统一的操作或处理。
我是在下面的这篇文章中学习的
SpringMVC 中 @ControllerAdvice 注解的三种使用场景! - 江南一点雨 - 博客园 (cnblogs.com)
二、封装结果集
对于code编码自己可以随便定义,下面只是一个例子
/**
 * 通用返回结果类,服务端响应的数据都会封装成此对象
 * @param <T>  这个类会接受多种类型,可能是普通对象,可能是数组、集合等等等等,所以我们要将这个加个泛型<T>,表示可以接收任何参数
 */
//  为什么不用Object,而用<T>?  如果用object需要强转类型 而T不用
@Data
public class R<T> {
    private Integer code; //编码:1成功,0和其它数字为失败
    private String msg; //错误信息
    private T data; //数据
    private Map map = new HashMap(); //动态数据
//  方法的返回值及参数中的T属于泛型
    public static <T> R<T> success(T object) {
        R<T> r = new R<T>();
        r.data = object;
        r.code = 1;   //成功
        return r;
    }
    public static <T> R<T> error(String msg) {
        R r = new R();
        r.msg = msg;
        r.code = 0;   //失败
        return r;
    }
    public R<T> add(String key, Object value) {
        this.map.put(key, value);
        return this;
    }
}
                

















