二、spring boot 1.5.4 异常控制
spring boot 已经做了统一的异常处理,下面看看如何自定义处理异常
1.错误码页面映射
1.1静态页面
必须配置在 resources/static/error文件夹下,以错误码命名
下面是404错误页面内容,当访问一个不存在的链接的时候,定位到此页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Not Found</title>
</head>
<body>
<h1>Sorry, Not Found</h1>
<p>
status code is 404
</p> </body>
</html>
显示效果
1.2动态模板页面(页面存放位置亦不能更改,且只有4xx和5xx这两个名称)
示例(5xx.ftl)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Error</title>
</head>
<body>
<h1>server error</h1>
<p>
<div style="color:red;font-size:large">error code: ${status}-${error}</div>
<div style="color:red;font-size:medium">error msg: ${exception!},${message!}</div> <div>
<div id="trace" style="color:grey;font-size:small;display: none;border: 1px solid black;padding: 10px;">${trace!}</div>
</div>
</p>
</body>
</html>
故意访问一个抛异常的请求(/test2/throwex)
@Controller
@RequestMapping("/test2")
public class Test2 { @RequestMapping("")
public String index(){
return "test";
} @RequestMapping("/throwex")
@ResponseBody
public String throwex(){
int a = 3;
int b=0;
return String.valueOf(a/b);
}
}
页面效果
如果使用ajax访问这个错误请求,则返回json表示的错误信息
演示页面(/test2 -> test.ftl)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>test</title>
<script type="text/javascript" src="/js/jquery-2.0.3.min.js"></script>
</head>
<body>
<h1>test page</h1>
<div>
<button onclick="doAjax();">请求异常测试</button> <div id="msg"></div>
<textarea id="errorMsg" style="color:red;width: 80%;height:300px"></textarea>
</div> <script type="text/javascript">
var doAjax = function () {
$.ajax({
url:'/test2/throwex',
async:true,
type:'GET',
data:{},
dataType:'json',
success:function (data) {
$('#msg').text(data);
},
error: function(xhr, textStatus, errorThrown) {
// alert(XMLHttpRequest.status);
// alert(XMLHttpRequest.readyState);
// alert(textStatus);
$('#errorMsg').text(xhr.responseText);
}
});
};
</script>
</body>
</html>
访问test页面,点击按钮,查看效果如下:
这里分别用网页浏览器和ajax访问出错的接口得到不同的结果,一个输出错误页面,一个输出错误Json,这个是由请求的接收类型决定的。
2.自定义错误码到页面的映射
2.1 静态页面映射配置(定制嵌入容器的时候控制错误码映射关系)
@Component
public class CustomizationBean implements EmbeddedServletContainerCustomizer{ /**
* 定制方法一:实现EmbeddedServletContainerCustomizer
* @param container
*/
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
//container.setPort(9000);
} /**
* 定制方法二:注入EmbeddedServletContainerFactory
* @return
*/
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
factory.setPort(9001);
factory.setSessionTimeout(10, TimeUnit.MINUTES);
//优先级高于配置在/static/error文件夹里面的404.html页面
factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/error/403.html"));
return factory;
}
}
2.2 动态页面映射配置
@Component
public class MyErrorViewResolver implements ErrorViewResolver { @Override
public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {
return new ModelAndView("/error/error",model);
} }
这个自定义ViewResolver将替代默认的页面处理器DefaultErrorViewResolver,上述配置将所有错误(不区分错误码)都映射到了错误页面error.ftl,进行统一管理。
新建error.ftl页面渲染错误内容
和5xx.ftl类似的配置
3.一些异常配置
#BasicErrorController的请求路径(你可以遇到错误后跳转的路径,该路径是一个BasicErrorController的请求路径,映射到它errorHtml或者error方法,由请求接受类型决定,一个返回错误页面,一个返回错误json)
#server.error.path=/error
#always include stacktrace(是否包含异常的堆栈信息,默认NEVER,页面无法获取到${trace!}的值,可取值NEVER,ALWAYS,ON_TRACE_PARAM; on_trace_param意思是请求带上参数 ?trace=true)
server.error.include-stacktrace=always
4.springboot异常处理流程
controller->出错跳转->BasicErrorController->调用errorHtml方法->getErrorAttributes(获取错误属性返回model)->丢给页面处理器ErrorViewResolver
所以你可以定制controller/定制ErrorAttributes/定制ErrorViewResolver等,实现更加复杂的异常处理
二、spring boot 1.5.4 异常控制的更多相关文章
- Spring Boot 之 RESRful API 权限控制
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “简单,踏实~ 读书写字放屁” 一.为何用RESTful API 1.1 RESTful是什么? ...
- Spring Boot Maven Plugin打包异常及三种解决方法:Unable to find main class
[背景]spring-boot项目,打包成可执行jar,项目内有两个带有main方法的类并且都使用了@SpringBootApplication注解(或者另一种情形:你有两个main方法并且所在类都没 ...
- spring boot如何处理异步请求异常
springboot自定义错误页面 原创 2017年05月19日 13:26:46 标签: spring-boot 方法一:Spring Boot 将所有的错误默认映射到/error, 实现Err ...
- Springboot 系列(七)Spring Boot web 开发之异常错误处理机制剖析
前言 相信大家在刚开始体验 Springboot 的时候一定会经常碰到这个页面,也就是访问一个不存在的页面的默认返回页面. 如果是其他客户端请求,如接口测试工具,会默认返回JSON数据. { &quo ...
- Spring Boot @ControllerAdvice 处理全局异常,返回固定格式Json
需求 在构建RestFul的今天,我们一般会限定好返回数据的格式比如: { "code": 0, "data": {}, "msg": ...
- Spring boot 入门二:Spring Boot配置文件详解
一.自定义属性 当我们创建一个springboot项目的时候,系统默认会为我们在src/main/java/resources目录下创建一个application.properties.同时也支持ym ...
- Springboot(二):Spring Boot 之 HelloWorld
关于项目的创建不再解释,需要了解的请参考: Springboot(一):使用Intellij中的Spring Initializr来快速构建Spring Boot工程 目录结构: 首先我们在上一项目的 ...
- spring boot(二): spring boot+jdbctemplate+sql server
前言 小项目或者做demo时可以使用jdbc+sql server解决即可,这篇就基于spring boot环境使用jdbc连接sql server数据库,和spring mvc系列保持一致. 在sp ...
- spring boot集成shrio用于权限控制
下面是一个简单的springBoot集成shrio的项目,技术是:spring boot+idea+gradle+shrio+mybatis 1:首先在build.gradle中导入依赖 builds ...
随机推荐
- 20155206 Exp2 后门原理与实践
20155206 Exp2 后门原理与实践 1.Windows获得Linux Shell 在windows下,打开CMD,使用ipconfig指令查看本机IP 然后使用ncat.exe程序,ncat. ...
- 20155306 白皎 0day漏洞——漏洞利用原理之DEP
20155306 白皎 0day漏洞--漏洞利用原理之DEP 一.DEP机制的保护原理 1.为什么出现DEP? 溢出攻击的根源在于现代计算机对数据和代码没有明确区分这一先天缺陷,就目前来看重新去设计计 ...
- 【第八课】php-fpm.conf配置文件解析
在discuz论坛的nginx配置文件当中,我们可以看到有一段php解析的配置,如下: location ~ \.php$ { try_files $uri = 404; fastcgi_pass 1 ...
- Mysql_游标
MySQL中的游标是一个十分重要的概念.游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制.MySQL中的游标的语法 ...
- Linux 上传代码到github
1.git init 初始化 2.git clone将刚刚创建的项目克隆下来 git clone https://github.com/... 3.进入到Project,编写代码 4.项目完成后执行g ...
- [dx11]利用SpriteFont绘制中文--本地化文本
1.下载DirectX11 Tool Kit SDK,解压后编译,生成DirectXTK.lib库文件和MakeSpriteFont应用工具; 2.在Dx11环境基础上,用生成的库文件搭建XTK环境; ...
- Catlike学习笔记(1.4)-使用Unity构建分形
又两个星期没写文章了,主要是沉迷 Screeps 这个游戏,真的是太好玩了导致我这两个礼拜 Github 小绿点几乎天天刷.其实想开一个新坑大概把自己写 AI 的心路历程记录下,不过觉得因为要消耗太多 ...
- bower配置私服nexus3
内容来自 https://help.sonatype.com/repomanager3/bower-repositories#BowerRepositories-BrowsingBowerReposi ...
- sqlserver批量删除字段 msrepl_tran_version
屁话不多说. 原因: msrepl_tran_version由于有非空约束.所以不能直接删除. --###############################################--1 ...
- Alpha阶段个人贡献分及转会人员确定
请各个团队协商确定个人贡献分,评分根据之前个团队确定的规则进行.每个团队的个人贡献分总数为50*N,N为团队的人数. 个人贡献分要求:必须是一个自然数,每个人分数互不相同,并且和为50*N. 请各个团 ...