浅谈SpringBoot中关于自定义异常处理的套路

  

在春季启动项目中,异常统一处理,可以使用弹簧中@ControllerAdvice来统一处理,也可以自己来定义异常处理方案.Spring引导中,对异常的处理有一些默认的策略,我们分别来看。

  

默认情况下,春天引导中的异常页面是这样的:

  

浅谈SpringBoot中关于自定义异常处理的套路”>,</p>
  <p>我们从这个异常提示中,也能看出来,之所以用户看到这个页面,是因为开发者没有明确提供一个/错误路径,如果开发者提供了/错误路径,这个页面就不会展示出来,不过春天在引导中,提供/错误路径实际上是下下策,弹簧引导本身在处理异常时,也是当所有条件都不满足时,才会去找/错误路径。那么我们就先来看看,春天在引导中,如何自定义错误页面,整体上来说,可以分为两种,一种是静态页面,另一种是动态页面。</p>
  <p> </p>
  <p>自定义静态异常页面,又分为两种,第一种是使用HTTP响应码来命名页面,例如html 404., 405.的html, 500。html ....,另一种就是直接定义一个4 xx。html表示,400 - 499年的状态都显示这个异常页面,5 xx。html表示,500 - 599年的状态显示这个异常页面。</p>
  <p>默认是在<代码>类路径:/静态/错误/</代码>路径下定义相关页面:</p>
  <p> <img src=

  

此时,启动项目,如果项目抛出500请求错误,就会自动展示500。html这个页面,发生404就会展示404。html页面。如果异常展示页面既存在5 xx。html,也存在500年。html,此时,发500年生异常时,优先展示500。html页面。

  

  

动态的异常页面定义方式和静态的基本一致,可以采用的页面模板有jsp、freemarker, thymeleaf。动态异常页面,也支持404。html或者4 xx。html,但是一般来说,由于动态异常页面可以直接展示异常详细信息,所以就没有必要挨个枚举错误了,直接定义4 xx。html(这里使用thymeleaf模板)或者5 xx。html即可。

  

注意,动态页面模板,不需要开发者自己去定义控制器,直接定义异常页面即可,弹簧引导中自带的异常处理器会自动查找到异常页面。

  

页面定义如下:

  

浅谈SpringBoot中关于自定义异常处理的套路

  

页面内容如下:

        & lt; !DOCTYPE html>   & lt; html lang=癳n”xmlns: th=" http://www.thymeleaf.org "比;   & lt; head>   & lt;元charset=皍tf - 8”比;   & lt; title> Title   & lt;/head>   & lt; body>   & lt; h2> 5 xx   & lt;表边界=?”在   & lt; tr>   & lt; td> path   & lt; td th:文本=" $ {path} "祝辞& lt;/td>   & lt;/tr>   & lt; tr>   & lt; td> error   & lt; td th:文本=" ${错误}"祝辞& lt;/td>   & lt;/tr>   & lt; tr>   & lt; td> message   & lt; td th:文本=" ${消息}"祝辞& lt;/td>   & lt;/tr>   & lt; tr>   & lt; td> timestamp   & lt; td th:文本=" ${时间戳}"祝辞& lt;/td>   & lt;/tr>   & lt; tr>   & lt; td> status   & lt; td th:文本=" ${地位}"祝辞& lt;/td>   & lt;/tr>   & lt;/table>   & lt;/body>   & lt;/html>      

默认情况下,完整的异常信息就是这5条,展示效果如下:

  

浅谈SpringBoot中关于自定义异常处理的套路

  

如果动态页面和静态页面同时定义了异常处理页面,例如<代码>类路径:/静态/错误/404。和<代码>类路径:/模板/错误/404。>   

发生了500错误——在查找动态500。html页面——在查找静态500。html——比;查找动态5 xx.html——在查找静态5 xx.html。

  

  

默认情况下,在春天的引导中,所有的异常数据其实就是上文所展示出来的5条数据,这5条数据定义在<代码> org.springframework.boot.web.reactive.error。DefaultErrorAttributes> getErrorAttributes 方法中:

        @Override   公共Map<字符串,Object>getErrorAttributes (ServerRequest请求,   布尔includeStackTrace) {   Object> Map<字符串;,errorAttributes=new LinkedHashMap<的在();   errorAttributes。把(“时间戳”,新的日期());   errorAttributes。把(“路径”,request.path ());   可抛出错误=getError(请求);   HttpStatus errorStatus=determineHttpStatus(错误);   errorAttributes。把(“地位”,errorStatus.value ());   errorAttributes。把(“错误”,errorStatus.getReasonPhrase ());   errorAttributes。把(“信息”,determineMessage(错误));   handleException (errorAttributes determineException(错误),includeStackTrace);   返回errorAttributes;   }

浅谈SpringBoot中关于自定义异常处理的套路