SpringBoot默认的错误处理机制

即我们常见的白色的ErrorPage页面

浏览器发送的请求头:

如果是其他的请求方式,比如客户端,则相应一个json数据:

原理;是通过 ErrorMvcAutoConfiguration,错误处理的自动配置;

给容器中添加了以下组件

1、DefaultErrorAttributes:

帮我们在页面共享信息;
@Overridepublic Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes,boolean includeStackTrace) {Map<String, Object> errorAttributes = new LinkedHashMap<String, Object>();errorAttributes.put("timestamp", new Date());addStatus(errorAttributes, requestAttributes);addErrorDetails(errorAttributes, requestAttributes, includeStackTrace);addPath(errorAttributes, requestAttributes);return errorAttributes;}

2、BasicErrorController:处理默认/error请求

@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {@RequestMapping(produces = "text/html")//产生html类型的数据;浏览器发送的请求来到这个方法处理public ModelAndView errorHtml(HttpServletRequest request,HttpServletResponse response) {HttpStatus status = getStatus(request);Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));response.setStatus(status.value());//去哪个页面作为错误页面;包含页面地址和页面内容ModelAndView modelAndView = resolveErrorView(request, response, status, model);return (modelAndView == null ? new ModelAndView("error", model) : modelAndView);}@RequestMapping@ResponseBody    //产生json数据,其他客户端来到这个方法处理;public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {Map<String, Object> body = getErrorAttributes(request,isIncludeStackTrace(request, MediaType.ALL));HttpStatus status = getStatus(request);return new ResponseEntity<Map<String, Object>>(body, status);}

3、ErrorPageCustomizer:

@Value("${error.path:/error}")private String path = "/error";  系统出现错误以后来到error请求进行处理;(web.xml注册的错误页面规则)

4、DefaultErrorViewResolver:

@Overridepublic ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status,Map<String, Object> model) {ModelAndView modelAndView = resolve(String.valueOf(status), model);if (modelAndView == null && SERIES_VIEWS.containsKey(status.series())) {modelAndView = resolve(SERIES_VIEWS.get(status.series()), model);}return modelAndView;}private ModelAndView resolve(String viewName, Map<String, Object> model) {//默认SpringBoot可以去找到一个页面?  error/404String errorViewName = "error/" + viewName;//模板引擎可以解析这个页面地址就用模板引擎解析TemplateAvailabilityProvider provider = this.templateAvailabilityProviders.getProvider(errorViewName, this.applicationContext);if (provider != null) {//模板引擎可用的情况下返回到errorViewName指定的视图地址return new ModelAndView(errorViewName, model);}//模板引擎不可用,就在静态资源文件夹下找errorViewName对应的页面   error/404.htmlreturn resolveResource(errorViewName, model);}

​ 一但系统出现4xx或者5xx之类的错误;ErrorPageCustomizer就会生效(定制错误的响应规则);就会来到/error请求;就会被BasicErrorController处理;

1)响应页面;去哪个页面是由DefaultErrorViewResolver解析得到的;

protected ModelAndView resolveErrorView(HttpServletRequest request,HttpServletResponse response, HttpStatus status, Map<String, Object> model) {//所有的ErrorViewResolver得到ModelAndViewfor (ErrorViewResolver resolver : this.errorViewResolvers) {ModelAndView modelAndView = resolver.resolveErrorView(request, status, model);if (modelAndView != null) {return modelAndView;}}return null;
}

2)、如何定制错误响应:

  如何定制错误的页面

1)、有模板引擎的情况下;error/状态码; 【将错误页面命名为 错误状态码.html 放在模板引擎文件夹里面的 error文件夹下】,发生此状态码的错误就会来到 对应的页面;

​ 我们可以使用4xx和5xx作为错误页面的文件名来匹配这种类型的所有错误,精确优先(优先寻找精确的状态码.html);

​ 页面能获取的信息;

​ timestamp:时间戳

​ status:状态码

​ error:错误提示

​ exception:异常对象

​ message:异常消息

​ errors:JSR303数据校验的错误都在这里

​ 2)、没有模板引擎(模板引擎找不到这个错误页面),静态资源文件夹下找;

​ 3)、以上都没有错误页面,就是默认来到SpringBoot默认的错误提示页面;

如何定制错误的json数据;

Controller.MyExceptionHandler

package com.project.javasystem.Controller;import com.project.javasystem.exception.UserNotExistException;
import org.springframework.http.HttpRequest;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;@ControllerAdvice
public class MyExceptionHandler {//方法一://浏览器,客户端都返回的是Json数据/* @ResponseBody//响应json数据@ExceptionHandler(UserNotExistException.class)public Map<String,Object> handleException(Exception e){Map<String,Object>map = new HashMap<>();map.put("code:","User.notExit");map.put("message:",e.getMessage());return map;}*///方法二:自适应效果@ExceptionHandler(UserNotExistException.class)public String handleException(Exception e,HttpServletRequest request){Map<String,Object>map = new HashMap<>();//传入自定义的状态码/*Integer statusCode = (Integer)request.getAttribute("javax.servlet.error.status_code");*/request.setAttribute("javax.servlet.error.status_code",500);map.put("code:","User.NotExit");map.put("message:","用户出错啦");//转发到error进行自适应处理request.setAttribute("MyError",map);//转发到errorreturn "forward:/error";}
}

3)、将我们的定制数据携带出去;

出现错误以后,会来到/error请求,会被BasicErrorController处理,响应出去可以获取的数据是由getErrorAttributes得到的(是AbstractErrorController(ErrorController)规定的方法);

​ 1、完全来编写一个ErrorController的实现类【或者是编写AbstractErrorController的子类】,放在容器中;

​ 2、页面上能用的数据,或者是json返回能用的数据都是通过errorAttributes.getErrorAttributes得到;

​ 容器中DefaultErrorAttributes.getErrorAttributes();默认进行数据处理的;

自定义ErrorAttributes

Component.MyErrorAttributes

package com.project.javasystem.Component;import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.WebRequest;
import java.util.Map;@Component
public class MyErrorAttributes  extends DefaultErrorAttributes {//返回值 map中就是页面和json能获取的所有字段
    @Overridepublic Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {Map<String, Object> map = super.getErrorAttributes(webRequest,includeStackTrace);map.put("CompanyName","517NA");// 异常处理器携带的数据Map<String,Object>MyError = (Map<String, Object>) webRequest.getAttribute("MyError", 0);map.put("MyError",MyError);return map;}
}

最终的效果:响应是自适应的,可以通过定制ErrorAttributes改变需要返回的内容,

转载于:https://www.cnblogs.com/thelovelybugfly/p/11380446.html

Springboot 错误处理机制相关推荐

  1. SpringBoot——错误处理机制 定制错误页面 (源码分析)

    目录 一.错误处理机制 二.ErrorPageCustomizer 三.BasicErrorController 四.DefaultErrorViewResolver 五.如何定制错误响应页面 六.D ...

  2. springboot返回modelandview 找不到视图_SpringBoot错误处理机制及原理

    SpringBoot错误信息处理机制 ★ 在一个web项目中,总需要对一些错误进行界面或者json数据返回,已实现更好的用户体验,SpringBoot中提供了对于错误处理的自动配置 " Er ...

  3. SpringBoot之错误处理机制

    文章目录 1.SpringBoot默认的错误处理机制 2.错误处理原理 (1)DefaultErrorAttributes (2)BasicErrorController:处理默认的/error请求 ...

  4. SpringBoot默认的错误处理机制

    错误处理机制: 访问一个不存在的页面时,或者程序抛出异常时 默认效果 浏览器返回一个错误的页面,注意查看浏览器发送请求的请求头 可以使用专业的软件比如postman分析返回的json数据 spring ...

  5. Springboot错误页面和错误信息定制

    SpringBoot2.1.4错误处理机制 前面一片已经介绍了springboot错误处理的机制,其实从整个分析过程中我们已经大概知道如何定制了. 1.错误页面自定义 springboot有个默认的错 ...

  6. Go语言的错误异常处理机制及其应用

    一.背景 在日常编写golang程序或阅读别人的golang代码时,我们总会看到如下的一堆代码块: xx, err = func(xx) if err != nil {//do sth. to tac ...

  7. Vue.js@2.6.10更新内置错误处机制,Fundebug同步支持相应错误监控

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: Fundebug 的 JavaScript 错误监控插件同步支持 Vue.js 异步错误监控. Vue.js 从诞生至 ...

  8. Laravel 5.5 的错误异常处理机制以及应用实例

    一.前言 我们在开发项目中,难免会因为逻辑上的失误而报错,这些报错的展现形式也就是框架封装好的异常处理机制.在项目上线之前,我们还可以根据框架提供的报错信息来锁定错误代码的位置.但是项目上线之后我们是 ...

  9. .net错误处理机制

    .net错误处理机制 让我们想想,ASP.NET为我们提供了几种错误处理机制?如果同时使用他们是不是有一定的优先级?.NET提供了四种错误处理机制,它们有一定的优先级顺序:Page_Error事件&g ...

最新文章

  1. memcache redis
  2. 使用Qt创建XML文档及XML文档的增删改
  3. TensorFlow调试常见问题(pycharm)
  4. 考研961数据结构c语言版真题,严蔚敏数据结构C语言版考研真题库
  5. (转) Android平台上关于IM的实践总结
  6. Python与数据库(2)Oracle
  7. ECCV 2020 Spotlight 谷歌论文大盘点
  8. pika集群水平扩展——让性能容量不再受限
  9. 禁用vsftpd欢迎语
  10. 力扣-590. N 叉树的后序遍历
  11. Http请求的流程原理以及请求详解
  12. 机器视觉中偏振片的应用
  13. ubuntu14.04 clementine音乐播放器无法播放ape格式解决方法
  14. navicat导数据速度_快速解决mysql导数据时,格式不对、导入慢、丢数据的问题
  15. vm压缩linux vmdk文件,vmware下vmdk文件越来越大的解决方法探讨
  16. Target DLL has been cancelled
  17. 汽车知识待解决作业题
  18. 兼容iOS 10 _升级xcode8_适配(四)
  19. 居民物业管理系统(数据结构单链表版)
  20. Java——静态方法

热门文章

  1. art2模型 matlab,Splart-Allmaras湍流模型及MATLAB编程~
  2. 根据车辆品牌获取品牌所属公司,车标logo,创建年份等基本信息
  3. 天勤数据结构代码——链表基本操作
  4. Python学习笔记之Python之禅
  5. 12月最新仿知音漫画网站源码+手机端,小说漫画生成静态文件,超强负载量安全可靠
  6. PMP项目管理敏捷项目管理
  7. js43刀片服务器内存位置,IBM Power服务器简介(ppt 43页)-精.ppt
  8. TLP:一个可以延长 Linux 笔记本电池寿命的高级电源管理工具
  9. CSS命名规范-BEM
  10. mtk_online_mac地址