文章目录
- 一、全局异常处理器
- 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;
}
}