SpringBoot2 全局异常处理
参考这篇文章里面的几种异常形式:
全局异常处理是个比较重要的功能,一般在项目里都会用到。
大概把一次请求分成三个阶段,来分别进行全局的异常处理。
一:在进入Controller之前,譬如请求一个不存在的地址,404错误。
二:在执行@RequestMapping时,进入逻辑处理阶段前。譬如传的参数类型错误。
三:以上都正常时,在controller里执行逻辑代码时出的异常。譬如NullPointerException。
http://blog.csdn.net/tianyaleixiaowu/article/details/70145251
直接将编写的全局异常处理类放入项目中,配置@Controller将类载入spring中即可使用,不需要任何配置。
以下是我写的异常处理类:
package com.archibladwitwicke.springboot2.chapter03.controller; import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController;
import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map; @Controller
public class GlobalErrorController extends AbstractErrorController {
private static final String ERROR_PATH = "/error";
private Log log = LogFactory.getLog(GlobalErrorController.class); @Autowired
ObjectMapper objectMapper; public GlobalErrorController() {
super(new DefaultErrorAttributes());
} @RequestMapping(ERROR_PATH)
public ModelAndView getErrorPath(HttpServletRequest request, HttpServletResponse response) {
Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(
request, false));
Throwable cause = getCause(request);
int status = (Integer) model.get("status");
//错误信息
String message = (String) model.get("message");
//友好提示
String errorMessage = getErrorMessage(cause); String requestPath = (String) model.get("path"); //后台打印日志信息方方便查错
log.info(status + ":" + message, cause);
log.info("requestPath---" + ":" + requestPath); //后台打印日志信息方方便查错
log.info(message, cause);
response.setStatus(status);
if (!isJsonRequest(request, model)) {
ModelAndView view = new ModelAndView("/error.btl");
view.addAllObjects(model);
view.addObject("status", status);
view.addObject("errorMessage", errorMessage);
view.addObject("cause", cause);
return view; } else {
Map<String, Object> error = new HashMap<>();
error.put("success", false);
error.put("errorMessage", getErrorMessage(cause));
error.put("message", message);
writeJson(response, error);
return null;
} } private boolean isJsonRequest(HttpServletRequest request, Map<String, Object> model) {
// 修复bug,在此类中,使用request无法获取requestPath
String requestPath = (String) model.get("path");
if (requestPath.endsWith(".json")) {
return true;
} else {
return (request.getHeader("accept").contains("application/json") || (request.getHeader("X-Requested-With") != null
&& request.getHeader("X-Requested-With").contains("XMLHttpRequest")));
}
} private void writeJson(HttpServletResponse response, Map<?, ?> error) {
response.setContentType("application/json;charset=utf-8");
try {
response.getWriter().write(objectMapper.writeValueAsString(error));
} catch (IOException e) {
e.printStackTrace();
}
} private String getErrorMessage(Throwable ex) {
/*不给前端显示详细错误*/
return "服务器错误,请联系管理员";
} private Throwable getCause(HttpServletRequest request) {
Throwable error = (Throwable) request.getAttribute("javax.servlet.error.exception");
if (error != null) {
while (error instanceof ServletException && error.getCause() != null) {
error = ((ServletException) error).getCause();
}
}
return error;
} @Override
public String getErrorPath() {
return ERROR_PATH;
}
}
可以根据项目具体修改这个方法,将判断ajax请求的种类进行完善,其余的部分可以不用修改:
private boolean isJsonRequest(HttpServletRequest request, Map<String, Object> model) {
// 修复bug,在此类中,使用request无法获取requestPath
String requestPath = (String) model.get("path");
if (requestPath.endsWith(".json")) {
return true;
} else {
return (request.getHeader("accept").contains("application/json") || (request.getHeader("X-Requested-With") != null
&& request.getHeader("X-Requested-With").contains("XMLHttpRequest")));
}
}
此异常类可以对上述三种异常情况进行拦截处理,显示自定义的异常处理页面或异常处理数据。
SpringBoot2 全局异常处理的更多相关文章
- mvc自定义全局异常处理
异常信息处理是任何网站必不可少的一个环节,怎么有效显示,记录,传递异常信息又成为重中之重的问题.本篇将基于上篇介绍的html2cancas截图功能,实现mvc自定义全局异常处理.先看一下最终实现效果: ...
- 在.NET Core程序中设置全局异常处理
以前我们想设置全局异常处理只需要这样的代码: AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledExc ...
- springMvc全局异常处理
本文中只测试了:实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器 对已有代码没有入侵性等优点,同时,在异常处理时能获取导致出现异常的对象,有利于提 ...
- MVC 全局异常处理及禁用显示头
MVC网站的global.asax中的Application_Start方法里,有这样一段代码: public class MvcApplication : System.Web.HttpApplic ...
- Spring MVC 解决无法访问静态文件和"全局异常处理"
我们都知道,Spring MVC的请求都会去找controller控制器,若果我们页面中引入了一个外部样式,这样是没效果的, 我们引入样式的时候是通过<like href="...&q ...
- Spring Boot 2.x 系列教程:WebFlux REST API 全局异常处理 Error Handling
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 本文内容 为什么要全局异常处理? WebFlux REST 全 ...
- .NET MVC全局异常处理(二)
目录 .NET MVC全局异常处理(二) MVC过滤器Filter .NET MVC全局异常处理(二) 对上节的内容进行了补充 MVC过滤器Filter MVC有四种过滤器:Authorization ...
- .NET MVC全局异常处理(一)
目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关的配置,但没有实际做过,以为改下设定就 ...
- Spring Boot 全局异常处理
Spring Boot版本 1.5 @ControllerAdvice public class GlobalExceptionHandler extends ResponseEntityExcept ...
随机推荐
- java.lang.RuntimeException: Date pattern must be set for column update_time in the schema of component
使用Talend open studio ,从mysql数据源中读取数据,将数据导出到excel文档,另外一个mysql数据库,和一个普通文件,遇到标题的错误,模型如下图所示: tMap将30.7中 ...
- 面试题一:linux面试题
2.4 写出一种排序算法(原理),并说出优化它的方法. 2.5 请简单阐述您最得意的开发之作 2.6 对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题 a. 确认服务器是否能支撑当前访问 ...
- Spring Boot 2.0 利用 Spring Security 实现简单的OAuth2.0认证方式1
0. 前言 之前帐号认证用过自己写的进行匹配,现在要学会使用标准了.准备了解和使用这个OAuth2.0协议. 1. 配置 1.1 配置pom.xml 有些可能会用不到,我把我项目中用到的所有包都贴出来 ...
- transfer learning
https://github.com/jindongwang/transferlearning ftp://ftp.cs.wisc.edu/machine-learning/shavlik-group ...
- ES6,新增数据结构WeakSet的用法
WeakSet和Set类似,同样是元素不重复的集合,它们的区别是WeakSet内的元素必须是对象,不能是其它类型. 特性: 1.元素必须是对象. 添加一个number类型的元素. const ws = ...
- u3d中的向量 vector3 vector2
Vector3(x,y,z)x代表左右,y代表上下,z代表前后 Vector3.magnitude 长度 计算两点之间的距离 .如果只给了一点的话.算出的长度其实就是和Vector3.zero点之间 ...
- python2/3中 将base64数据写成图片,并将图片数据转为16进制数据的方法、bytes/string的区别
1.python2将base64数据写成图片,并将数据转为16进制字符串的方法 import binascii img = u'R0lGODlhagAeAIcAAAAAAAAARAAAiAAAzABE ...
- 对JSON格式的城市按照拼音首字母排序
需求说明: App应用中最常见的一种操作就是对城市按照拼音首字母排序,以方便选择城市.而已有的json格式的城市数据是没有这种排序的. 已有的json格式的城市数据格式如下[简化之后]: 数据格式说明 ...
- ADB Fix error : insufficient permissions for device
Ubuntu 15中在使用中Android开发板时,命令行下输入adb devices.adb shell会提示insufficient permissions for device. 通常重启下ad ...
- js随机生成一个数组中的随机字符串以及更新验证码
随机生成m,n范围的值得公式: Math.random()*(n-m)+m: 改正公式:Math.random()*(n+1-m)+m // 生成随机字符串function randomMixed(n ...