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

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

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

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

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

  

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

  1. private 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. }

  

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

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. zookeeper 启动脚本

    #!/bin/bash export JAVA_HOME=/usr/java/latest export JRE_HOME=/usr/java/latest/jre zoo=/data/package ...

  2. MySQL 自定义函数CREATE FUNCTION实例

    分享一个MySQL 自定义函数CREATE FUNCTION的实例.mysql> delimiter $$mysql> CREATE FUNCTION myFunction-> (i ...

  3. ios使用kvc机制简化对json的解析

    在 ios开发中,我们经常需要对服务器的传回来的json进行解析,特别是对哪些字段特别多的就会又烦躁的情绪.tmd都是一样的东西,要为每个property赋值,真是累人啊.举个简单的例子吧.服务器会过 ...

  4. [na]计算机网络性能指标(延迟/吞吐量/RTT等)

    参考 计算机网络性能指标 计算机网络性能指标 带宽.速率.延迟.吞吐量.丢包率(无线验收标准一般-75dbm,del<100ms,丢包率3%) 带宽x延迟 决定着路上的数据的多少. 速率: 连接 ...

  5. Market Guide for AIOps Platforms

    AIOps platforms enhance IT operations through greater insights by combining big data, machine learni ...

  6. [Windows Azure] Administering your Windows Azure AD tenant

    Administering your Windows Azure AD tenant 19 out of 20 rated this helpful - Rate this topic Publish ...

  7. 【Delphi】基于状态机的串口通信

    通信协议 串行通信接口(如RS232.RS485等)作为计算机与单片机交互数据的主要接口,广泛用于各类仪器仪表.工业监测及自动控制领域中. 通信协议是需要通信的双方所达成的一种约定,它对包括数据格式. ...

  8. 【Linux技术】磁盘的物理组织,深入理解文件系统

    磁盘即是硬盘,由许多块盘片(盘面)组成,每个盘片的上下两面都涂有磁粉,磁化后可以存储信息数据.每个盘片的上下两面都安装有磁头,磁头被安装在梳状的可以做直线运动的小车上以便寻道,每个盘面被格式化成有若干 ...

  9. spark快速上手

    spark快速上手 前言 基于Spark 2.1版本 仅仅是快速上手,没有深究细节 主要参考是官方文档 代码均为官方文档中代码,语言为Scala 进入spark-shell 终端输入spark-she ...

  10. maven 使用记录之修改 maven默认jdk版本

    maven package执行的时候会遇到jdk版本不对的问题 :原因是 maven所指定的jdk版本与项目使用的jdk版本不一致 1.项目属性的 java compiler可以设置 2.直接修改 m ...