出现异常时,我们的Mapper-Service-Controller三层架构会层层往上抛出异常。如果Controller层也没有对异常做出处理的话,那么最终会抛给框架,框架就会返回一个JSON格式的数据,里面封装的是错误信息。
那么我们该怎么解决呢?
解决方案
-
方案一:在所有Controller的所有方法中进行try…catch处理
-
缺点:代码臃肿(不推荐)
-
-
方案二:全局异常处理器
-
好处:简单、优雅(推荐)
-
全局异常处理器
- 定义全局异常处理器,需要你在项目最外层定义一个和三层架构同级的包,然后里面定义一个类
- 定义类的时候,在类上加一个注释,@RestControllerAdvice,加上这个注释代表我们定义了一个全局异常处理器
- 在全局异常处理器中,需要定义一个方法来捕获异常,在这个方法中加上注释@ExceptionHandler,通过这个注解的value属性来指定我们要捕获的是哪一类型的异常
@RestControllerAdvice=@ControllerAdvice+@ResponseBody
处理异常的方法的返回值会转化为json然后在响应给前端
Exception.class 代表拦截所有的异常
package com.itheima.exception;import com.itheima.pojo.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public Result ex(Exception e){e.printStackTrace();return Result.error("sorry");}}
以上就是全局异常处理器的使用,主要涉及到两个注解:
-
@RestControllerAdvice //表示当前类为全局异常处理器
-
@ExceptionHandler //指定可以捕获哪种类型的异常进行处理