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 ...
随机推荐
- zookeeper 启动脚本
#!/bin/bash export JAVA_HOME=/usr/java/latest export JRE_HOME=/usr/java/latest/jre zoo=/data/package ...
- MySQL 自定义函数CREATE FUNCTION实例
分享一个MySQL 自定义函数CREATE FUNCTION的实例.mysql> delimiter $$mysql> CREATE FUNCTION myFunction-> (i ...
- ios使用kvc机制简化对json的解析
在 ios开发中,我们经常需要对服务器的传回来的json进行解析,特别是对哪些字段特别多的就会又烦躁的情绪.tmd都是一样的东西,要为每个property赋值,真是累人啊.举个简单的例子吧.服务器会过 ...
- [na]计算机网络性能指标(延迟/吞吐量/RTT等)
参考 计算机网络性能指标 计算机网络性能指标 带宽.速率.延迟.吞吐量.丢包率(无线验收标准一般-75dbm,del<100ms,丢包率3%) 带宽x延迟 决定着路上的数据的多少. 速率: 连接 ...
- Market Guide for AIOps Platforms
AIOps platforms enhance IT operations through greater insights by combining big data, machine learni ...
- [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 ...
- 【Delphi】基于状态机的串口通信
通信协议 串行通信接口(如RS232.RS485等)作为计算机与单片机交互数据的主要接口,广泛用于各类仪器仪表.工业监测及自动控制领域中. 通信协议是需要通信的双方所达成的一种约定,它对包括数据格式. ...
- 【Linux技术】磁盘的物理组织,深入理解文件系统
磁盘即是硬盘,由许多块盘片(盘面)组成,每个盘片的上下两面都涂有磁粉,磁化后可以存储信息数据.每个盘片的上下两面都安装有磁头,磁头被安装在梳状的可以做直线运动的小车上以便寻道,每个盘面被格式化成有若干 ...
- spark快速上手
spark快速上手 前言 基于Spark 2.1版本 仅仅是快速上手,没有深究细节 主要参考是官方文档 代码均为官方文档中代码,语言为Scala 进入spark-shell 终端输入spark-she ...
- maven 使用记录之修改 maven默认jdk版本
maven package执行的时候会遇到jdk版本不对的问题 :原因是 maven所指定的jdk版本与项目使用的jdk版本不一致 1.项目属性的 java compiler可以设置 2.直接修改 m ...