SpringBoot2 全局异常处理

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

全局异常处理是个比较重要的功能,一般在项目里都会用到。 
大概把一次请求分成三个阶段,来分别进行全局的异常处理。 
一:在进入Controller之前,譬如请求一个不存在的地址,404错误。 
二:在执行@RequestMapping时,进入逻辑处理阶段前。譬如传的参数类型错误。 
三:以上都正常时,在controller里执行逻辑代码时出的异常。譬如NullPointerException。 
http://blog.csdn.net/tianyaleixiaowu/article/details/70145251

直接将编写的全局异常处理类放入项目中,配置@Controller将类载入spring中即可使用,不需要任何配置。

以下是我写的异常处理类:

1package com.archibladwitwicke.springboot2.chapter03.controller; 2 3import com.fasterxml.jackson.databind.ObjectMapper; 4import org.apache.commons.logging.Log; 5import org.apache.commons.logging.LogFactory; 6import org.springframework.beans.factory.annotation.Autowired; 7import org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController; 8import org.springframework.boot.web.servlet.error.DefaultErrorAttributes; 9import org.springframework.stereotype.Controller; 10import org.springframework.web.bind.annotation.RequestMapping; 11import org.springframework.web.servlet.ModelAndView; 12 13import javax.servlet.ServletException; 14import javax.servlet.http.HttpServletRequest; 15import javax.servlet.http.HttpServletResponse; 16import java.io.IOException; 17import java.util.Collections; 18import java.util.HashMap; 19import java.util.Map; 20 21@Controller 22public class GlobalErrorController extends AbstractErrorController { 23 private static final String ERROR_PATH = "/error"; 24 private Log log = LogFactory.getLog(GlobalErrorController.class); 25 26 @Autowired 27 ObjectMapper objectMapper; 28 29 public GlobalErrorController() { 30 super(new DefaultErrorAttributes()); 31 } 32 33 @RequestMapping(ERROR_PATH) 34 public ModelAndView getErrorPath(HttpServletRequest request, HttpServletResponse response) { 35 Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes( 36 request, false)); 37 Throwable cause = getCause(request); 38 int status = (Integer) model.get("status"); 39 //错误信息 40 String message = (String) model.get("message"); 41 //友好提示 42 String errorMessage = getErrorMessage(cause); 43 44 String requestPath = (String) model.get("path"); 45 46 47 //后台打印日志信息方方便查错 48 log.info(status + ":" + message, cause); 49 log.info("requestPath---" + ":" + requestPath); 50 51 //后台打印日志信息方方便查错 52 log.info(message, cause); 53 response.setStatus(status); 54 if (!isJsonRequest(request, model)) { 55 ModelAndView view = new ModelAndView("/error.btl"); 56 view.addAllObjects(model); 57 view.addObject("status", status); 58 view.addObject("errorMessage", errorMessage); 59 view.addObject("cause", cause); 60 return view; 61 62 } else { 63 Map<String, Object> error = new HashMap<>(); 64 error.put("success", false); 65 error.put("errorMessage", getErrorMessage(cause)); 66 error.put("message", message); 67 writeJson(response, error); 68 return null; 69 } 70 71 72 } 73 74 private boolean isJsonRequest(HttpServletRequest request, Map<String, Object> model) { 75 // 修复bug,在此类中,使用request无法获取requestPath 76 String requestPath = (String) model.get("path"); 77 if (requestPath.endsWith(".json")) { 78 return true; 79 } else { 80 return (request.getHeader("accept").contains("application/json") || (request.getHeader("X-Requested-With") != null 81 && request.getHeader("X-Requested-With").contains("XMLHttpRequest"))); 82 } 83 } 84 85 private void writeJson(HttpServletResponse response, Map<?, ?> error) { 86 response.setContentType("application/json;charset=utf-8"); 87 try { 88 response.getWriter().write(objectMapper.writeValueAsString(error)); 89 } catch (IOException e) { 90 e.printStackTrace(); 91 } 92 } 93 94 private String getErrorMessage(Throwable ex) { 95 /*不给前端显示详细错误*/ 96 return "服务器错误,请联系管理员"; 97 } 98 99 private Throwable getCause(HttpServletRequest request) { 100 Throwable error = (Throwable) request.getAttribute("javax.servlet.error.exception"); 101 if (error != null) { 102 while (error instanceof ServletException && error.getCause() != null) { 103 error = ((ServletException) error).getCause(); 104 } 105 } 106 return error; 107 } 108 109 @Override 110 public String getErrorPath() { 111 return ERROR_PATH; 112 } 113}

可以根据项目具体修改这个方法,将判断ajax请求的种类进行完善,其余的部分可以不用修改:

1private boolean isJsonRequest(HttpServletRequest request, Map<String, Object> model) { 2 // 修复bug,在此类中,使用request无法获取requestPath 3 String requestPath = (String) model.get("path"); 4 if (requestPath.endsWith(".json")) { 5 return true; 6 } else { 7 return (request.getHeader("accept").contains("application/json") || (request.getHeader("X-Requested-With") != null 8 && request.getHeader("X-Requested-With").contains("XMLHttpRequest"))); 9 } 10 }

此异常类可以对上述三种异常情况进行拦截处理,显示自定义的异常处理页面或异常处理数据。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

03.Android崩溃Crash库之ExceptionHandler分析

目录总结00.异常处理几个常用api01.UncaughtExceptionHandler02.Java线程处理异常分析03.Android中线程处理异常分析04.为何使用setDefaultUncaughtExceptionHandler前沿上一篇整体介绍了crash崩溃

初探 Objective

作者:Cyandev,iOS和MacOS开发者,目前就职于字节跳动0x00前言异常处理是许多高级语言都具有的特性,它可以直接中断当前函数并将控制权转交给能够处理异常的函数。不同语言在异常处理的实现上各不相同,本文主要来分析一下ObjectiveC和C这两个语言。为什么要把ObjectiveC和