SpringBoot小技巧:统一异常处理

SpringBoot小技巧:统一异常处理

情景描述

  对于接口的定义,我们通常会有一个固定的格式,比如:

  

  但是调用方在请求我们的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

  ControllerAdvice拆分开来就是Controller Advice,关于Advice,前面我们讲解Spring Aop时讲到,其是用于封装一个切面所有属性的,包括切入点和需要织入的切面逻辑。这里ContrllerAdvice也可以这么理解,其抽象级别应该是用于对Controller进行“切面”环绕的,而具体的业务织入方式则是通过结合其他的注解来实现的。@ControllerAdvice是在类上声明的注解,其用法主要有三点:

  • 结合方法型注解@ExceptionHandler,用于捕获Controller中抛出的指定类型的异常,从而达到不同类型的异常区别处理的目的
  • 结合方法型注解@InitBinder,用于request中自定义参数解析方式进行注册,从而达到自定义指定格式参数的目的;
  • 结合方法型注解@ModelAttribute,表示其标注的方法将会在目标Controller方法执行之前执行。

参考链接

原文地址:https://www.cnblogs.com/MrSaver/p/11871883.html