欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

springboot自定义异常处理

程序员文章站 2022-05-25 20:17:22
springboot异常处理 Author:SimpleWu 默认错误处理机制 SpringBoot默认的错误处理直接回返回对应的错误视图页面。比如404错误。 如果是其它客户端访问,默认相应一个json数据。比如通过postman来访问当前页面。 springboot错误页面处理过程: Sprin ......

springboot异常处理

author:simplewu

默认错误处理机制

springboot默认的错误处理直接回返回对应的错误视图页面。比如404错误。

如果是其它客户端访问,默认相应一个json数据。比如通过postman来访问当前页面。

springboot错误页面处理过程:

springboot的错误信息配置是通过errormvcautoconfiguration来进行配置的,这个类中帮我们注册了一下组件。

  • defaulterrorattributes:帮我们在页面上共享错误信息。
  • basicerrorcontroller:处理默认的/error请求。分为两种处理请求的方式,一种是html方式,一种是json方式。
  • errorpagecustomizer:系统发生错误后,该对象就会生效,来定义请求规则。
  • defaulterrorviewresolver:默认的错误视图解析器,将错误信息解析到相应的错误视图。

处理error请求过程: 一旦系统出现4xx或者 5xx之类的错误, errorpagecustomizer就会生效(定义错误的相应规则),就会来到/error请求。就会被basicerrorcontroller处理。basicerrorcontroller会根据请求头requestheaders中的accept来区分是浏览器发送的请求还是其它工具发出的请求。分为两个处理方法,一个是errorhtml()和error(),在errorhtml()方法中,获取错误状态信息,由resolveerrorview解析器解析到默认的错误视图页面。错误页面是/error/404.html页面。如果templates中error里面有这个页面404错误就会精确匹配404.html如果没有这个404.html他会模糊匹配4xx.html页面,如果templates中没有找到错误页面,它就会去static文件中找。

页面可以获取的错误信息:

  • timestamp:时间戳。
  • status:状态码。
  • error:错误提示。
  • exception:异常对象。
  • message:异常消息。
  • errors:数据效验相关的信息。

注意:static文件夹存放的是静态页面,它没有办法使用模板引擎表达式

了解了上面的计息过程以后,我们自定义错误就简单了。自定义html错误页面分为两种情况:

有模板引擎的情况下,在templates文件夹下建立一个error文件夹,里面以错误号的方式添加错误页面。我们也可以使用4xx和5xx作为错误页面的文件名来匹配这种类型的其它错误,精确优先。

没有模板引擎的情况下,在静态资源文件夹下添加以错误号命名的错误页面。

自定义异常返回json数据

这种异常处理方式没有自适应效果,不论页面还是其它工具都会返回json格式的数据。

@controlleradvice
public class myexceptionhandler {
  @responsebody
  @exceptionhandler(runtimeexception.class)
  public map<string,object> handleexception(exception e){
  map<string,object> map = new hashmap<>();
  map.put("code","user.notexist");
  map.put("message",e.getmessage());
  return map;
  }
}

这种处理方式错误码是500他首先会去模板引擎error中找定制的错误页面,没有就会去静态资源文件中error文件夹去。

@controlleradvice
public class myexceptionhandler {
@exceptionhandler(usernotexistexception.class)
public string handleexception(exception e, httpservletrequest request){
  map<string,object> map = new hashmap<>();
  //传入我们自己的错误状态码 4xx 5xx,否则就不会进入定制错误页面的解析流程
  //integer statuscode = (integer) request.getattribute("javax.servlet.error.status_code");
  request.setattribute("javax.servlet.error.status_code",500);
  map.put("code","user.notexist");
  map.put("message",e.getmessage());
  //转发到/error
  return "forward:/error";
  }
}