Author:SimpleWuhtml
SpringBoot默认的错误处理直接回返回对应的错误视图页面。好比404错误。java
若是是其它客户端访问,默认相应一个json数据。好比经过postman来访问当前页面。spring
springboot错误页面处理过程:json
SpringBoot的错误信息配置是经过ErrorMvcAutoConfiguration来进行配置的,这个类中帮咱们注册了一下组件。浏览器
处理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文件中找。springboot
页面能够获取的错误信息:工具
注意:static文件夹存放的是静态页面,它没有办法使用模板引擎表达式
post
了解了上面的计息过程之后,咱们自定义错误就简单了。自定义html错误页面分为两种状况:spa
有模板引擎的状况下,在templates文件夹下创建一个error文件夹,里面以错误号的方式添加错误页面。咱们也能够使用4xx和5xx做为错误页面的文件名来匹配这种类型的其它错误,精确优先。code
没有模板引擎的状况下,在静态资源文件夹下添加以错误号命名的错误页面。
这种异常处理方式没有自适应效果,不论页面仍是其它工具都会返回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"; } }