一、springboot错误的默认处理机制
默认效果:
1)、浏览器,返回一个默认的错误页面
2)、如果是其他客户端,默认响应一个json数据
二、如何定制错误响应
1、如何定制错误的页面;
1)、有模板引擎的情况下;error/状态码; 【将错误页面命名为 错误状态码.html 放在模板引擎文件夹里面的 error文件夹下】,发生此状态码的错误就会来到对应的页面;
我们可以使用4xx和5xx作为错误页面的文件名来匹配这种类型的所有错误,精确优先(优先寻找精确的状态码.html);
页面能获取的信息;
timestamp:时间戳
status:状态码
error:错误提示
exception:异常对象
message:异常消息
errors:JSR303数据校验的错误都在这里
2)、没有模板引擎(模板引擎找不到这个错误页面),静态资源文件夹下找;
3)、以上都没有错误页面,就是默认来到SpringBoot默认的错误提示页面;
2、如何定制错误的json数据
1)、自定义异常处理&返回定制json数据;
@ControllerAdvice public class MyExceptionHandler { //浏览器和客户端返回的都是json @ResponseBody @ExceptionHandler(UserNotExistException.class) public MaphandleException(Exception e){ Map map = new HashMap<>(); map.put("code", "user.notexists"); map.put("message",e.getMessage()); return map; } }
2)、转发到/error进行自适应响应效果处理
@ControllerAdvice public class MyExceptionHandler { @ExceptionHandler(UserNotExistException.class) public String handleException(HttpServletRequest request,Exception e){ Mapmap = new HashMap<>(); //传入我们自己的错误状态码 request.setAttribute("javax.servlet.error.status_code", 400); map.put("code", "user.notexists"); map.put("message",e.getMessage()); request.setAttribute("etx", map); return "forword:/error"; } }
3)、将我们的定制数据携带出去(携带到页面,或者响应的json字符串)
出现错误以后,会来到/error请求,会被BasicErrorController处理,响应出去可以获取的数据是由getErrorAttributes得到的(是AbstractErrorController(ErrorController)规定的方法);
1、完全来编写一个ErrorController的实现类【或者是编写AbstractErrorController的子类】,放在容器中;
2、页面上能用的数据,或者是json返回能用的数据都是通过errorAttributes.getErrorAttributes得到;
容器中DefaultErrorAttributes.getErrorAttributes();默认进行数据处理的;
自定义ErrorAttributes
//给容器中加入我们自己定义的ErrorAttributes @Component public class MyErrorAttributes extends DefaultErrorAttributes { @Override public MapgetErrorAttributes(WebRequest webRequest, boolean includeStackTrace) { Map errorAttributes = super.getErrorAttributes(webRequest, includeStackTrace); errorAttributes.put("personal", "houchen"); Map etx = (Map )webRequest.getAttribute("etx", 0); errorAttributes.put("etx", etx); return errorAttributes; } }