一、背景
1、共有的操作应该抽离到框架级别,如exception处理,日志打印
2、这样可以屏蔽因不同人的使用习惯而导致的try_catch混乱,同时也可以简化代码的结构,使可读性提高。
3、现在的后台框架中无聊异常与否对前端的返回结构都是相同的(一般都是actionResult(是否成功,异常码,异常信息,返回对象),这也给异常处理抽离框架级别提供了前提。
二、问题分析
1、首先,这要求所有异常的返回的结果结构都是一致的。
a、一般,待处理的异常大致分两种:业务异常(需要打warning级别日志,记录入参信息)和系统异常(要打err级别日志,积累出入参及异常信息)。
2、可以重写框架全局异常处理的方法来实现
3、可以在结果返回前重构异常
三、具体实现
1、返回结果设计类设计
a、一般有两种:带页数的DataResult<T> 和不带页数的ActionResult<T>
b、前置用于支持返回记录总页数
c、DataResult中包括静态方法和边界的结果判断逻辑(hasError)
d、ActionResult<T> 和它类似,但data:List<T>被取代为data:T
2、spring全局异常处理
1、这个实现主要思想是为异常提供一个解析视图,视图中做一些逻辑处理,最后将处理结果转成文字返回
2、AbstractView便是视图的基类,实现该类对出参进行转换。
3、ModelAndView 最后将视图和上下文变量放入该对象中交于框架渲染。
该处会每次new一个对象,需要优化。
4、org.springframework.web.servlet.DispatcherServlet.doDispatch().processDispatchResult()中调用,若没有对应的处理视图,会将异常抛出。
3、拦截器处理
1、主要是使用拦截器在结果返回前端前进行再处理,该实现的执行在方法2后。
2、继承HandlerInterceptorAdapter,实现afterCompletion方法,在该方法中实现对异常的逻辑处理并最后将处理后的字符串写入到response中。
3、拦截器需要在mvc框架中注入才能生效,即:com.zhicheng.config.WebMvcConfigurer.addInterceptors(InterceptorRegistry)
4、该方法和实现2一样,也是servlet路由类中调用的,即:org.springframework.web.servlet.DispatcherServlet.triggerAfterCompletion()
PS:
代码详见:git@github.com:MindMapKing/springboot_12022327.git