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. Oracle11g数据库在Win系统下的安装

    首先将从Oracle官网下载的两个安装包解压到同一个文件夹下,比如解压到database. 点击setup进行安装. (1)配置安全更新 选择是(不指定邮件) (2)安装选项,选择创建和配置数据库. ...

  2. 牛客提高D6t3 分班问题

    分析 就就就是推柿子 看官方题解吧/px 代码 #include<iostream> #include<cstdio> #include<cstring> #inc ...

  3. 牛客提高D3t1 破碎的矩阵

    分析 我们发现如果行的异或和等于列的异或和那么对于n-1行m-1列的所有数的选择都是任意的 因为一定可以在它的行末/列末选一个合适的数是的整体满足 但是我们发现对于右下角那一个数是否满足存疑 我们设矩 ...

  4. threading.get_ident()

    https://docs.python.org/3/library/threading.html Return the 'thread identifier' of the current threa ...

  5. 像计算机科学家一样思考python-第2章 变量、表达式和语句

    感想: 1.程序出现语义错误时,画状态图是一个很好的调试办法.打印出关键变量在不同代码处理后值的变化,就能发现问题的蛛丝马迹. 2.每当学习新语言特性时,都应当在交互模式中进行尝试,并故意犯下错误,看 ...

  6. 解决Win7部分便笺的元数据已被损坏的方法

    Win7部分便笺的元数据已被损坏的方法 我们使用键盘上"Win+F"组合键搜索功能,直接找到"inkobj.dll"这个文件,一般会搜索出来好多,先随便选一个. ...

  7. Linux-磁盘配额

    磁盘配额作用是限制普通用户使用的磁盘空间和创建文件的个数,不至于因为个别人的浪费而影响所有人的使用,需要内核的支持 注意:目前只有 ext2 ext3文件系统支持 需要用户程序quota程序包 先查看 ...

  8. curl的一些常用命令

    在学习nodejs中get到了一项新的技能crul curl 可以给在命令行上面给node服务器发送一些信息,然后得到服务器返回而响应信息,在命令行中打印出来. 下面是我整理的一些常用的命令:

  9. MySQL replace into 与insert into

    https://blog.csdn.net/helloxiaozhe/article/details/77427266 使用replace带来的问题 1.Replace into 操作在唯一键重复情况 ...

  10. deepin修改默认Python2到Python3

    第一步 打开终端 第二步 输入 sudo vi ~/.bashrc 然后你会看到如下界面: 切大写,输入E,进入如下界面,并在最后输入我已经输入的 alias python='python3' ,记住 ...