七叶笔记 » java编程 » SpringBoot接口如何统一异常处理

SpringBoot接口如何统一异常处理

为什么要优雅的处理异常

如果我们不统一的处理异常,经常会在controller层有大量的异常处理的代码, 比如:

那怎么实现统一的异常处理,特别是结合参数校验等封装?

实现案例

简单展示通过@ControllerAdvice进行统一异常处理。

@ControllerAdvice异常统一处理

对于400参数错误异常

对于自定义异常

对于其它异常

Controller接口

(接口中无需处理异常)

运行测试

这里用postman测试下:

进一步理解

我们再通过一些问题来帮助你更深入理解

@ControllerAdvice还可以怎么用?

除了通过@ExceptionHandler注解用于全局异常的处理之外,@ControllerAdvice还有两个用法:

@InitBinder注解

用于请求中注册自定义参数的解析,从而达到自定义请求参数格式的目的;

比如,在@ControllerAdvice注解的类中添加如下方法,来统一处理日期格式的格式化

Controller中传入参数(string类型)自动转化为Date类型

@ModelAttribute注解

用来预设全局参数,比如最典型的使用Spring Security时将添加当前登录的用户信息(UserDetails)作为参数。

所有controller类中requestMapping方法都可以直接获取并使用currentUser

@ControllerAdvice是如何起作用的(原理)?

DispatcherServlet中onRefresh方法是初始化ApplicationContext后的回调方法,它会调用initStrategies方法,主要更新一些servlet需要使用的对象,包括国际化处理,requestMapping,视图解析等等。

从上述代码看,如果要提供@ControllerAdvice提供的三种注解功能,从设计和实现的角度肯定是实现的代码需要放在initStrategies方法中。

@ModelAttribute和@InitBinder处理

具体来看,如果你是设计者,很显然容易想到:对于@ModelAttribute提供的参数预置和@InitBinder注解提供的预处理方法应该是放在一个方法中的,因为它们都是在进入requestMapping方法前做的操作。

如下方法是获取所有的HandlerAdapter,无非就是从BeanFactory中获取

我们要处理的是requestMapping的handlerResolver,作为设计者,就很容易出如下的结构

在RequestMappingHandlerAdapter中的afterPropertiesSet去处理advice

@ExceptionHandler处理

@ExceptionHandler显然是在上述initHandlerExceptionResolvers(context)方法中。

同样的,从BeanFactory中获取HandlerExceptionResolver

我们很容易找到ExceptionHandlerExceptionResolver

同样的在afterPropertiesSet去处理advice

到此这篇关于SpringBoot接口如何统一异常处理的文章就介绍到这了,更多相关SpringBoot接口 异常处理内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!

相关文章