参考这篇文章里面的几种异常形式:

全局异常处理是个比较重要的功能,一般在项目里都会用到。 
大概把一次请求分成三个阶段,来分别进行全局的异常处理。 
一:在进入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 全局异常处理的更多相关文章

  1. mvc自定义全局异常处理

    异常信息处理是任何网站必不可少的一个环节,怎么有效显示,记录,传递异常信息又成为重中之重的问题.本篇将基于上篇介绍的html2cancas截图功能,实现mvc自定义全局异常处理.先看一下最终实现效果: ...

  2. 在.NET Core程序中设置全局异常处理

    以前我们想设置全局异常处理只需要这样的代码: AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledExc ...

  3. springMvc全局异常处理

    本文中只测试了:实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器 对已有代码没有入侵性等优点,同时,在异常处理时能获取导致出现异常的对象,有利于提 ...

  4. MVC 全局异常处理及禁用显示头

    MVC网站的global.asax中的Application_Start方法里,有这样一段代码: public class MvcApplication : System.Web.HttpApplic ...

  5. Spring MVC 解决无法访问静态文件和"全局异常处理"

    我们都知道,Spring MVC的请求都会去找controller控制器,若果我们页面中引入了一个外部样式,这样是没效果的, 我们引入样式的时候是通过<like href="...&q ...

  6. Spring Boot 2.x 系列教程:WebFlux REST API 全局异常处理 Error Handling

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 本文内容 为什么要全局异常处理? WebFlux REST 全 ...

  7. .NET MVC全局异常处理(二)

    目录 .NET MVC全局异常处理(二) MVC过滤器Filter .NET MVC全局异常处理(二) 对上节的内容进行了补充 MVC过滤器Filter MVC有四种过滤器:Authorization ...

  8. .NET MVC全局异常处理(一)

    目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关的配置,但没有实际做过,以为改下设定就 ...

  9. Spring Boot 全局异常处理

    Spring Boot版本 1.5 @ControllerAdvice public class GlobalExceptionHandler extends ResponseEntityExcept ...

随机推荐

  1. kibana显示报错

    "status": 500,            "reason": "ElasticsearchException[org.elasticsear ...

  2. [hihoCoder] 第四十八周: 拓扑排序·二

    题目1 : 拓扑排序·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学校的校园网被黑客入侵并投放了病毒.这事在校内BBS上立刻引起了大家的讨论,当 ...

  3. CentOS 7 安装开发者环境

    在vagrant box中安装了基本的centos7的box,但是,该环境没有安装编译软件,所以要求自行安装. 1.查看群组安装的源包数量: yum group list ,搜索Development ...

  4. nginx configure fastdfs + SSL

    ./configure \ --prefix=/usr/local/nginx \ --with-http_stub_status_module \ --with-http_ssl_module \ ...

  5. nginx配置长连接

    http { keepalive_timeout 20; --长连接timeout keepalive_requests 8192; --每个连接最大请求数 } events { worker_con ...

  6. javascript的toString深入探究

    toString()方法是所有对象都有的一个方法,无论是字符串,数组,对象,都可以调用这个方法,但是,事实上,他们调用的并不是同一个函数哦! 看下面的代码: var str = '123'; cons ...

  7. lua的模块加载require

    加载指定的模块.首先函数会在 package.loaded 这个表中查看是否已经加载 了 modname 这个模块.如果是,那么 require 会返回保存在 package.loaded[modna ...

  8. 解决chrome extension无法下载的问题

    由于GFW把谷歌应用商店给屏蔽了,下载chrome扩展变得很困难. 我使用的是版本30.0.1599.101 m. 那么你需要做的第一个处理是,修改host文件,保证chrome应用商店可以登录.如下 ...

  9. 【转】mysqldump的锁表的问题

    今天凌晨,公司的一台MySQL生产库备份时间从2:30一直备份到8:30,正常情况下这个备份应该只会备份20分钟,3:00之前就会备份完毕,但是这次备份时间太长了,也影响了公司业务的使用.先写一下公司 ...

  10. java 多线程 28 : 多线程组件之 Semaphore 信号量

    Semaphore是非常有用的一个组件,它相当于是一个并发控制器,是用于管理信号量的.构造的时候传入可供管理的信号量的数值,这个数值就是控制并发数量的,就是同时能几个线程访问.我们需要控制并发的代码, ...