Spring Boot 继承 AbstractErrorController 实现全局异常处理

@RequestMapping("${server.error.path:${error.path:/error}}"):

	如果在 application 中设置了 server.error.path,就映射该值。

	如果 error.path 有值就映射该值。

	否则映射 /error。

	优先级=> server.error.path > error.path > /error

自定义错误页面:

	Spring Boot 将所有的错误默认映射到/error, 实现ErrorController。

	Html静态页面:在resources/static/error/ 下定义

		如添加404页面: resources/static/error/404.html页面,中文注意页面编码

	模板引擎页面:在templates/error/ 下定义

		如添加5xx页面: resources/templates/error/5xx.ftl
注:resources/templates/error/ 的优先级比较 resources/static/error/高 通过在src/main/resources/templates文件夹中添加error.html错误页面实现自定义错误信息。 通过在src/main/resources/templates/error中添加404.html等以http错误码开头的页面实现不同http错误状态的不同展现。 /error 请求的触发前提是系统中抛出的异常到最终都没有被处理掉: Spring Boot可以通过 @ControllerAdvice 和 @ExceptionHandler 实现捕获系统中的异常。 如果 @ControllerAdvice 中如果有其他异常没有捕获到,最终仍然会通过 BasicErrorController 处理这些异常。 request 对象中包含的异常信息:
javax.servlet.error.status_code 类型为Integer 错误状态代码
javax.servlet.error.exception_type 类型为Class 异常的类型
javax.servlet.error.message 类型为String 异常的信息
javax.servlet.error.exception 类型为Throwable 异常类
javax.servlet.error.request_uri 类型为String 异常出现的页面
javax.servlet.error.servlet_name 类型为String 异常出现的servlet名 Object throwableObject = request.getAttribute("javax.servlet.error.exception");
if (throwableObject == null) {
//未发现异常
return;
}
Throwable throwable = (Throwable) throwableObject;
log.error("捕获一个异常", throwable); @Slf4j
@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class CommonController extends AbstractErrorController { //错误参数
private final ErrorProperties errorProperties; /**
* ErrorAttributes:
* 提供给用户可以记录或显示的错误属性。
* 我们可以自定义一个ErrorAttributes类,只要实现ErrorAttributes即可。
* 默认 Spring Boot 已经帮我们实现了一个DefaultErrorAttributes。
*/
public CommonController(ErrorAttributes errorAttributes,
ServerProperties serverProperties) {
super(errorAttributes);
this.errorProperties = serverProperties.getError();
} /**
* 错误处理器
*/
@GetMapping
public String handleError(HttpServletRequest request, HttpServletResponse response, Model model) { //Http状态
HttpStatus status = getStatus(request); log.error("错误Path:[{}],状态码:[{}]", getErrorPath(), status); //将错误描述放入error属性中
Map<String, Object> errorDetail = Collections.unmodifiableMap(getErrorAttributes(request, isIncludeStackTrace(request)));
model.addAttribute("error", errorDetail); log.debug("错误描述:[{}]", errorDetail); if (status.equals(HttpStatus.INTERNAL_SERVER_ERROR)) {
//内部服务错误:500
return "themes/主题名/500";
} else if (status.equals(HttpStatus.NOT_FOUND)) {
//未发现错误:404
return "themes/主题名/404"
} else {
//默认错误处理器
return "common/error/error";
}
} /**
* 获取错误Path:/error
*/
@Override
public String getErrorPath() {
return this.errorProperties.getPath();
}
}

Controller 返回值

1、返回 ModelAndView

	返回 ModelAndView 是最常见的一种返回结果。
需要在方法结束的时候定义一个 ModelAndView 对象,并对 Model 和 View 分别进行设置。 2、返回String 1):字符串代表逻辑视图名 真实的访问路径 = “前缀” + 逻辑视图名 + “后缀” Model的返回方式如下: public String test(Model model){
model.addAttribute(attrName,attrValue);
return "逻辑视图名";
} 2):代表redirect重定向(return "redirect:path") 使用redirect进行重定向那么地址栏中的URL会发生变化,同时不会携带上一次的request。 3):代表forward转发(return "forward:path") 通过forward进行转发,地址栏中的URL不会发生改变,同时会将上一次的request携带到下一次请求中去。 3、返回void 返回这种结果的时候可以在Controller方法的形参中定义HTTPServletRequest和HTTPServletResponse对象进行请求的接收和响应。 1)使用request转发页面
  request.getRequestDispatcher("转发路径").forward(request,response); 2)使用response进行页面重定向
response.sendRedirect("重定向路径"); 3)也可以使用response指定响应结果
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter.write("json串");

Halo(十一)的更多相关文章

  1. CRL快速开发框架系列教程十一(大数据分库分表解决方案)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  2. 我的MYSQL学习心得(十一) 视图

    我的MYSQL学习心得(十一) 视图 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  3. WCF学习之旅—第三个示例之五(三十一)

       上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九) WCF学习 ...

  4. [占位-未完成]scikit-learn一般实例之十一:异构数据源的特征联合

    [占位-未完成]scikit-learn一般实例之十一:异构数据源的特征联合 Datasets can often contain components of that require differe ...

  5. 关于大型网站技术演进的思考(二十一)--网站静态化处理—web前端优化—下【终篇】(13)

    本篇继续web前端优化的讨论,开始我先讲个我所知道的一个故事,有家大型的企业顺应时代发展的潮流开始投身于互联网行业了,它们为此专门设立了一个事业部,不过该企业把这个事业部里的人事成本,系统运维成本特别 ...

  6. CPrimerPlus第十一章中的“选择排序算法”学习

    C Primer Plus第十一章字符串排序程序11.25中,涉及到“选择排序算法”,这也是找工作笔试或面试可能会遇到的题目,下面谈谈自己的理解. 举个例子:对数组num[5]={3,5,2,1,4} ...

  7. 无废话ExtJs 入门教程二十一[继承:Extend]

    无废话ExtJs 入门教程二十一[继承:Extend] extjs技术交流,欢迎加群(201926085) 在开发中,我们在使用视图组件时,经常要设置宽度,高度,标题等属性.而这些属性可以通过“继承” ...

  8. GPS部标监控平台的架构设计(十一)-基于Memcached的分布式Gps监控平台

    部标gps监控平台的架构,随着平台接入的车辆越来越多,架构也面临越来越大的负载挑战,我们当然希望软件尽可能的优化并能够接入更多的车辆,减少在硬件上的投资.但是当车辆增多到某一个临界点的时候,仍然要面临 ...

  9. 双十一 VS 火车票(12306)

    火车票开售了,又是一年,code了一年,咱们也该回顾回顾了. 还记得12306上线之初各种技术大牛给人家出方案,吐槽人家外包费用?我们来回顾回顾. 就园子里都过千篇文章来侃这事儿,请问有多少主题的文章 ...

随机推荐

  1. Linux下MySQL 5.5的修改字符集编码为UTF8(彻底解决中文乱码问题)

    一.登录MySQL查看用SHOW VARIABLES LIKE 'character%';下字符集,显示如下: +--------------------------+---------------- ...

  2. HDU 5634 Rikka with Phi

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5634 ------------------------------------------------ ...

  3. 软件-Jenkins:Jenkins 百科

    ylbtech-软件-Jenkins:Jenkins 百科 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续 ...

  4. 为什么每次打出的包都是Release版本呢?

    参考了:xcodebuild命令 https://www.cnblogs.com/liuluoxing/p/8622108.html 重新打个包,验证一下想法

  5. vcsa6.5安装部署配置(vSphere vsan 6.5)

    首先您最好先了解下vcenter和vcsa是啥:VMware Vsphere 几个不同的组件 esxi是在物理服务器安装的服务端,所有虚拟机是安装再esxi里面的,是服务端:vcenter是管理端 是 ...

  6. python实现自动发送邮件

    Python发送邮件成功的前提,应是先开启授权码.目前使用广泛的邮箱有:163邮箱.qq邮箱等. 163邮箱开启授权码的方法如下图: qq邮箱开启授权码的方法如下图: 接下来代码的实现: import ...

  7. Bootstrap 学习笔记4 巨幕页头略缩图警告框

  8. 洛谷T89643 escape

    题目描述 题目链接:https://www.luogu.org/problem/T89643 由于 Kiana 实在是太忙了,所以今天的题里面没有 Kiana. 某一天学校里有 n 节课,出题人希望逃 ...

  9. [CF960G]Bandit Blues(第一类斯特林数+分治卷积)

    Solution: ​ 先考虑前缀,设 \(f(i, j)\) 为长度为 \(i\) 的排列中满足前缀最大值为自己的数有 \(j\) 个的排列数. 假设新加一个数 \(i+1\) 那么会有: \[ f ...

  10. JS对像和数组的遍历

    零. 通用遍历方法 0.1 for...in... let obj = {0:"a", 1:"b", 2:"c"}; for (let ke ...