对于接口的定义,我们通常会有一个固定的格式,比如:
但是调用方在请求我们的API时把接口地址写错了,就会得到一个404错误,且不同于我们定义的数据格式。
我们需要在发生这种系统错误时也能返回我们自定义的那种格式,就需要定义一个异常处理类,这个类既可以返回统一的格式,也可以统一记录异常日志。
我们在@ExceptionHandler(value = Exception.class)中指明了异常器处理Exception及其子类。JsonResponse是我们返回格式的实体类,当发生异常时,会被封装好并返回给调用方。
@ControllerAdvice public class GlobalExceptionHandler { private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); @ExceptionHandler(value = Exception.class) @ResponseBody public JsonResponse defaultErrorHandler(HttpServletRequest request, HttpServletResponse response,Exception e){ logger.error("",e); JsonResponse jsonResponse = new JsonResponse(); jsonResponse.setMsg(e.getMessage()); //[!] 单独处理运行时异常 if(e instanceof RuntimeException) jsonResponse.setStatus(500); else jsonResponse.setStatus(502); jsonResponse.setData(null); return jsonResponse; } }
ControllerAdvice拆分开来就是Controller Advice,关于Advice,前面我们讲解Spring Aop时讲到,其是用于封装一个切面所有属性的,包括切入点和需要织入的切面逻辑。这里ContrllerAdvice也可以这么理解,其抽象级别应该是用于对Controller进行“切面”环绕的,而具体的业务织入方式则是通过结合其他的注解来实现的。@ControllerAdvice是在类上声明的注解,其用法主要有三点:
原文:https://www.cnblogs.com/MrSaver/p/11871883.html