文章目录

  • 一、背景
  • 二、SpringBoot的默认异常处理BasicErrorController
  • 三、自定义错误异常

写在前面:
我是「境里婆娑」。我还是从前那个少年,没有一丝丝改变,时间只不过是考验,种在心中信念丝毫未减,眼前这个少年,还是最初那张脸,面前再多艰险不退却。
写博客的目的就是分享给大家一起学习交流,如果您对 Java感兴趣,可以关注我,我们一起学习。

前言:ErrorController是SpringBoot调用Controller出错时的一个统一处理接口,它的实现为BasicErrorController。

一、背景

使用SpringBoot调用controller时,如果系统出现404,405,500等这种报错信息时,系统默认会展示如下信息:
如果把这种错误展示给用户看,对于用户来说是不友好的。对于这种报错信息,我们需要做统一处理,我们根据不同的错误类型,返回给用户不同的返回信息。SpringBoot就提供了一个这样统一处理异常的接口类ErrorController。下面我们简单说明一下如何实现一个自定义的异常处理机制。

二、SpringBoot的默认异常处理BasicErrorController

在看了源码之后发现有一个配置类ErrorMvcAutoConfiguration,当工程启动的时候,已经把BasicErrorController加载到Spring容器里面。因此当我们程序报错的时候会直接调用这个处理异常的controller。

错误地址配置:

看完源码,我们发现如果你在配置文件配置了server.error.path的话,就会使用你配置的异常处理地址,如果没有就会使用你配置的error.path路径地址,如果还是没有,默认使用/error来作为发生异常的处理地址。

BasicErrorController这两个方法是关键

  • getErrorPath()错误页路径
  • errorHtml()返回错误页信息
 public String getErrorPath() {return this.errorProperties.getPath();}@RequestMapping(produces = {"text/html"})public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {HttpStatus status = this.getStatus(request);Map<String, Object> model = Collections.unmodifiableMap(this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.TEXT_HTML)));response.setStatus(status.value());ModelAndView modelAndView = this.resolveErrorView(request, response, status, model);return modelAndView != null ? modelAndView : new ModelAndView("error", model);}

三、自定义错误异常

通过研究BasicErrorController,我们自定义错误异常需要实现ErrorContrroller大概需要四点。

  • 实现ErrorController接口,并重写getErrorPath()方法,指定异常跳转的url;
  • 对类添加@RestController注解,添加异常跳转url的Controller;
  • 获取请求响应的类型,针对不同的响应错误类型,做不同的逻辑处理。
  • 在template目录下存放错误页面的HTML文件。
@Slf4j
@Controller
@RequestMapping("/error")
@EnableConfigurationProperties({ServerProperties.class})
public class ErrorPagesController implements ErrorController {private ErrorAttributes errorAttributes;@Autowiredprivate ServerProperties serverProperties;/*** 初始化ExceptionController** @param errorAttributes*/@Autowiredpublic ErrorPagesController(ErrorAttributes errorAttributes) {Assert.notNull(errorAttributes, "ErrorAttributes must not be null");this.errorAttributes = errorAttributes;}@RequestMapping("/404")public ModelAndView errorHtml404(HttpServletRequest request, HttpServletResponse response, WebRequest webRequest) {response.setStatus(HttpStatus.NOT_FOUND.value());Map<String, Object> model = getErrorAttributes(webRequest, isIncludeStackTrace(request, MediaType.TEXT_HTML));model.put("queryString", request.getQueryString());return new ModelAndView("error/404", model);}@RequestMapping("/403")public ModelAndView errorHtml403(HttpServletRequest request, HttpServletResponse response, WebRequest webRequest) {response.setStatus(HttpStatus.FORBIDDEN.value());// 404拦截规则,如果是静态文件发生的404则不记录到DBMap<String, Object> model = getErrorAttributes(webRequest, isIncludeStackTrace(request, MediaType.TEXT_HTML));model.put("queryString", request.getQueryString());if (!String.valueOf(model.get("path")).contains(".")) {model.put("status", HttpStatus.FORBIDDEN.value());}return new ModelAndView("error/403", model);}@RequestMapping("/400")public ModelAndView errorHtml400(HttpServletRequest request, HttpServletResponse response, WebRequest webRequest) {response.setStatus(HttpStatus.BAD_REQUEST.value());Map<String, Object> model = getErrorAttributes(webRequest, isIncludeStackTrace(request, MediaType.TEXT_HTML));model.put("queryString", request.getQueryString());return new ModelAndView("error/400", model);}@RequestMapping("/401")public ModelAndView errorHtml401(HttpServletRequest request, HttpServletResponse response, WebRequest webRequest) {response.setStatus(HttpStatus.UNAUTHORIZED.value());Map<String, Object> model = getErrorAttributes(webRequest, isIncludeStackTrace(request, MediaType.TEXT_HTML));model.put("queryString", request.getQueryString());return new ModelAndView("error/401", model);}@RequestMapping("/500")public ModelAndView errorHtml500(HttpServletRequest request, HttpServletResponse response, WebRequest webRequest) {response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());Map<String, Object> model = getErrorAttributes(webRequest, isIncludeStackTrace(request, MediaType.TEXT_HTML));model.put("queryString", request.getQueryString());return new ModelAndView("error/500", model);}/*** Determine if the stacktrace attribute should be included.** @param request*         the source request* @param produces*         the media type produced (or {@code MediaType.ALL})* @return if the stacktrace attribute should be included*/protected boolean isIncludeStackTrace(HttpServletRequest request,MediaType produces) {ErrorProperties.IncludeStacktrace include = this.serverProperties.getError().getIncludeStacktrace();if (include == ErrorProperties.IncludeStacktrace.ALWAYS) {return true;}return include == ErrorProperties.IncludeStacktrace.ON_TRACE_PARAM && getTraceParameter(request);}/*** 获取错误的信息** @param webRequest* @param includeStackTrace* @return*/private Map<String, Object> getErrorAttributes(WebRequest webRequest,boolean includeStackTrace) {return this.errorAttributes.getErrorAttributes(webRequest, includeStackTrace);}/*** 是否包含trace** @param request* @return*/private boolean getTraceParameter(HttpServletRequest request) {String parameter = request.getParameter("trace");return parameter != null && !"false".equalsIgnoreCase(parameter);}/*** 获取错误编码** @param request* @return*/private HttpStatus getStatus(HttpServletRequest request) {Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");if (statusCode == null) {return HttpStatus.INTERNAL_SERVER_ERROR;}try {return HttpStatus.valueOf(statusCode);} catch (Exception ex) {log.error("获取当前HttpStatus发生异常", ex);return HttpStatus.INTERNAL_SERVER_ERROR;}}/*** 实现错误路径,暂时无用** @return*/@Overridepublic String getErrorPath() {return "";}
}

以上就是SpringBoot异常处理ErrorController详解,如果大家喜欢请一键三连。

SpringBoot异常处理ErrorController详解相关推荐

  1. SpringBoot异常处理回滚事务详解(自动回滚、手动回滚、部分回滚)

    参考:https://blog.csdn.net/zzhongcy/article/details/102893309 概念 事务定义 事务,就是一组操作数据库的动作集合.事务是现代数据库理论中的核心 ...

  2. SpringBoot异常处理回滚事务详解(自动回滚、手动回滚、部分回滚)(事务失效)...

    参考:https://blog.csdn.net/zzhongcy/article/details/102893309 概念 事务定义 事务,就是一组操作数据库的动作集合.事务是现代数据库理论中的核心 ...

  3. java框架魔乐_16 魔乐科技 SpringBoot框架开发详解

    资源内容: 16 魔乐科技 SpringBoot框架开发详解|____springboot开发代码.rar|____第一章:SpringBoot入门          |____2. SpringBo ...

  4. SpringBoot 整合EasyExcel详解(一)-高性能Excel方案

    SpringBoot 整合EasyExcel详解(二)-写Excel SpringBoot 整合EasyExcel详解(三)-填充Excel-官方原版 一.概述 Java解析.生成Excel比较有名的 ...

  5. java异常处理机制详解

    java异常处理机制详解 参考文章: (1)java异常处理机制详解 (2)https://www.cnblogs.com/vaejava/articles/6668809.html 备忘一下.

  6. SpringMVC异常处理机制详解[附带源码分析]

    SpringMVC异常处理机制详解[附带源码分析] 参考文章: (1)SpringMVC异常处理机制详解[附带源码分析] (2)https://www.cnblogs.com/fangjian0423 ...

  7. SpringBoot的配置详解application

    SpringBoot的配置文件application有两种文件格式,两种配置的内容是一致的,只是格式不一致. 1.application.properties 2.application.yml或者a ...

  8. springboot+jsp中文乱码_【spring 国际化】springMVC、springboot国际化处理详解

    在web开发中我们常常会遇到国际化语言处理问题,那么如何来做到国际化呢? 你能get的知识点? 使用springgmvc与thymeleaf进行国际化处理. 使用springgmvc与jsp进行国际化 ...

  9. creo配置文件config选项详解_5年资深架构师重点聚焦:SpringBoot的配置详解+内嵌Servlet容器

    Spring Boot的配置详解 在本节中,我们将重点聚焦在Spring Boot的配置方面. 理解Spring Boot的自动配置 按照"约定大于配置"的原则,Spring Bo ...

最新文章

  1. 口碑扑街光环不在,2018将是苹果手机最难熬的年头!
  2. OPNET仿真zigbee
  3. [云炬创业基础笔记]第六章商业模式测试16
  4. 左值和左值引用、右值和右值引用
  5. 大话InnoDB索引原理
  6. mybatis更新Blob类型字段要用updateByPrimaryKeyWithBLOBs
  7. 易方机器人教育怎么样_定州3岁以上儿童机器人教学多少钱
  8. python 用命令安装pip_用pip命令安装Python第三方库
  9. Hibernate查询_HQL_EJBQL_QBC_QBE
  10. mysql replication(主从复制)(二)MSS模式
  11. spring 定时器功能
  12. 【动画消消乐】HTML+CSS 自定义加载动画 069
  13. 将Ubuntu的引导写入自己所在分区——变色龙引导Linux,Windows,Mac OS(苹果系统)攻略之一
  14. 鸿蒙os2021升级日程,消息称华为EMUI 11.1三月上线:更... - @是Ustinian鸭 的微博精选 - 微博国际站...
  15. 计算机不断自动重启,电脑不断自动重启怎么办_解决电脑不断自动重启的方法...
  16. git clone失败:Cloning into... fatal: unable to access... error setting certificate verify locations
  17. sendgrid html text,在Node.js中的SendGrid的“发件人”字段中添加名称
  18. python tkinter Entry的使用
  19. zzulioj1094c语言版答案,ZZULIOJ 1094: 统计元音(函数专题)
  20. 【它山之玉】博士三年发表论文回顾—科学网马臻

热门文章

  1. obs可以推到中转服务器吗,[经验分享]OBS 如何实现多路推流
  2. pd 生成mysql 脚本_PowerDesigner 如何生成数据库更新脚本
  3. 香帅的北大金融学课笔记16 -- 公司决策
  4. vb.net2019-hello,world
  5. Pandas文本处理双雄extract+extractall
  6. 【深度学习】算法工程师面试必考点:Dropout和R-Dropout的使用技巧
  7. 避免入坑:如何知道一个导师的人品?
  8. 数据挖掘提分三板斧!
  9. 【机器学习基础】(四):通俗理解支持向量机SVM及代码实践
  10. 创造属于你自己的深度学习框架,就在这2天时间