SpringBoot错误处理机制?
1.1 默认错误处理
浏览器访问出现错误时,会返回一个默认的错误页面。
其他客户端访问出现错误,默认响应一个json数据。
{
"timestamp":"2020-05-07T03:04:44.737+0000",
"status":404,
"error":"Not Found",
"message":"No message available",
"path":"/crud/aax"
}
1234567
如何区分是浏览器访问还是客户端访问?
原因在于浏览器和其他客户端的请求头的accept属性对html页面的请求优先级不同。
1.2 错误处理原理
一但系统出现4xx或者5xx之类的错误,ErrorPageCustomizer组件生效,会执行/error请求。被BasicErrorController处理,此时就会根据请求头的不同来判定返回是返回响应页面还是响应数据。
响应页面:去哪个页面是由DefaultErrorViewResolver解析得到的。
错误处理的自动配置原理可以参照ErrorMvcAutoConfiguration类,该类添加了下列组件:
1、DefaultErrorAttributes组件
作用:帮我们在页面共享信息、
源码:
public class DefaultErrorAttributes implements ErrorAttributes, HandlerExceptionResolver, Ordered {
...
@Override
public Map getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
Map errorAttributes = new LinkedHashMap<>();
errorAttributes.put("timestamp", new Date());//时间戳
addStatus(errorAttributes, webRequest);//状态码
addErrorDetails(errorAttributes, webRequest, includeStackTrace);
addPath(errorAttributes, webRequest);
return errorAttributes;
}
...
}
1234567891011121314
2、BasicErrorController组件
作用:处理默认/error请求
www.04-cfanim.cn
源码:
@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {
...
//产生html类型的数据
@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
HttpStatus status = getStatus(request);
Map model = Collections
.unmodifiableMap(getErrorAttributes(request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));
response.setStatus(status.value());
www.aqrcw.com.cn
//去哪个页面作为错误页面,包含页面地址和页面内容
ModelAndView modelAndView = resolveErrorView(request, response, status, model);
return (modelAndView != null) ? modelAndView : new ModelAndView("error", model);
}
//产生json类型的数据
www.Leide-tech.cn
@RequestMapping
public ResponseEntity