SpringBoot统一异常处理

  

SpringBoot统一异常处理
 SpringBoot统一异常处理”> <br/>异常和响应码</p>
  <p>因为用RESTful设计的接口,应该用状态码反映请求的错误,不应该统一返回200的状态码,然后再通过味精来描述错误。所以统一异常处理比较关键。</p>
  <p>异常一般分为业务异常和非业务异常<br/> <img src=公共ModelAndView errorHtml (HttpServletRequest请求,
HttpServletResponse响应){
HttpStatus状态=getStatus(请求);
Map<字符串,Object>=集合模型。unmodifiableMap (getErrorAttributes (
请求,isIncludeStackTrace(请求,MediaType.TEXT_HTML))),
response.setStatus (status.value ());
ModelAndView ModelAndView=resolveErrorView(请求、响应状态模型),
返回(ModelAndView !=null) ?modelAndView:新modelAndView (“error"、模型);
}

  
 <代码> @RequestMapping
  @ResponseBody
  公共ResponseEntity&肝移植;Map&肝移植;字符串,Object& gt;和gt;错误(HttpServletRequest请求){
  Map&肝移植;字符串,Object& gt;身体=getErrorAttributes(请求,
  isIncludeStackTrace(请求,MediaType.ALL));
  HttpStatus状态=getStatus(请求);
  返回新ResponseEntity&肝移植;和gt;(身体、状态);
  } 
     

浏览器端错误页面

  

 SpringBoot统一异常处理

  

如果想自定义页面替换这个页面,你只需在/错误文件夹下添加一个表示错误页面的文件。该文件可以是一个静态的HTML,也可以使用模板。这个文件的名字应该是精确的状态码或者是表示一个系列的模糊名称。如下:

  
  

src/
+ -主要/
+ java/
| + & lt;源code>
/
+ + -资源-公共/
+错误/
| + - 404。html
+ - & lt;其他公共assets>

  

src/
+ -主要/
+ java/
| + & lt;源code>
/
+ + -资源-模板/
+错误/
| + - 5 xx。ftl
+ - & lt;其他templates>

     

其背后的原理在于上面提到的errorHtml方法。当出现异常时,该方法会查询是否有错误在文件夹下提供对应错误状态码的静态资源文件,如果有则返回该文件,没有则返回上小节讲到的白色错误标签页。如果想要知道更详细的细节请查看相关源码。
<强> JSON格式错误
当请求头中的接受的值为application/JSON时,就会返回JSON数据了。出现异常时,BasicErrorController类中误差的方法将被执行。会获取错误信息然后以JSON格式返回。如下图:

  

 SpringBoot统一异常处理

  

<>强自定义异常处理
下面有两种方式自定义异常处理

  

对于应用级别的业务异常处理,我们可以通过注解@ControllerAdvice或@RestControllerAdvice来实现异常处理。但是上面的注解只能捕获处理应用级别的异常,例如控制器中抛出自定义的异常。却不能处理容器级别的异常,例如过滤器中抛出的异常等。
要想处理容器级别的异常,需要继承BasicErrorController类,重写errorHtml和错误方法。或者实现ErrorController接口,起到和类BasicErrorController相似的作用。

  

<强>处理应用级别异常

  

下面是返回JSON格式的处理类@RestControllerAdvice
br/> @RestControllerAdvice
  

 <代码>私有静态最终长serialVersionUID l=1;
  
  @ExceptionHandler (value=https://www.yisu.com/zixun/MissingServletRequestParameterException.class)
  @ResponseStatus (HttpStatus.BAD_REQUEST)
  公共R defaultErrorHandler (HttpServletRequest点播、异常e){抛出异常
  返回新R 

SpringBoot统一异常处理