springboot框架的全局异常处理方案详解

系统框架搭建的前期过程中,为了约束代码规范,我们会对一些通用功能做一些处理,比如声明一些系统公用错误类、封装通用返回结果、统一异常处理等,这样做的优势是团队开发过程中能够形成统一的代码规范,增强代码可读性,同时又便于后期代码维护。本文主要介绍下框架中异常的处理:

1.声明全局异常处理类,并添加@ControllerAdvice和@RestController注解
代码如下:

@ControllerAdvice
@RestController
public class GlobalExceptionHandler {

	private final Logger logger = Logger.getLogger(GlobalExceptionHandler.class);

	//空指针异常
  @ExceptionHandler(NullPointerException.class)
  public Map<String, Object> nullPointer(NullPointerException e,HttpServletRequest req){
    logger.error(e.getMessage());
		e.printStackTrace();
    return ResultObject.newResultObj(ErrorCode.NULLPOINTER);
  }

	//IO异常
	@ExceptionHandler(IOException.class,HttpServletRequest req, HttpServletResponse res)
  public Map<String, Object> IOException(IOException e){
  	 logger.error(e.getMessage());
		 e.printStackTrace();
     return ResultObject.newResultObj(ErrorCode.IOEXCEPTION);
  }

	//权限不足异常
	@ExceptionHandler(UnauthorizedException.class)
	public Map<String, Object> unauth(HttpServletRequest req, HttpServletResponse res){
		return ResultObject.newResultObj(ErrorCode.UNAUTH);
	}

	//未登录异常
	@ExceptionHandler(AuthorizationException.class)
	public Map<String, Object> unlogin(HttpServletRequest req, HttpServletResponse res){
		return ResultObject.newResultObj(ErrorCode.NOTLOGIN);
	}

	//其它异常
	@ExceptionHandler(Exception.class)
	public Map<String, Object> error(Exception e,HttpServletRequest req, HttpServletResponse res){
		logger.error(e.getMessage());
		e.printStackTrace();
		return ResultObject.newResultObj(ErrorCode.SYSTEM);
	}

}

2.声明系统通用错误处理类

/**
 * 系统通用错误处理类
 */
public class ErrorCode {

  //返回码
  private int code = 0;

  //描述信息
  private String errmsg = "SUCCESS";

  //成功
  public static final ErrorCode SUCCESS 					  = new ErrorCode(0,"SUCCESS");
  public static final ErrorCode PARAMS 					  = new ErrorCode(100000,"参数错误");
  public static final ErrorCode SYSTEM 					  = new ErrorCode(100001,"系统错误");
	public static final ErrorCode UNLOGIN 					  = new ErrorCode(100002,"未登录");
  public static final ErrorCode UNAUTH 					  = new ErrorCode(100003,"权限错误");
	public static final ErrorCode NULLPOINTER 					= new ErrorCode(100004,"空指针错误");
	public static final ErrorCode IOEXCEPTION 					= new ErrorCode(100005,"IO错误");
  public static final ErrorCode UPLOAD_FAIL 					= new ErrorCode(100006,"文件上传失败");
  public static final ErrorCode REPEAT 					  = new ErrorCode(100007,"数据已存在");

  public ErrorCode() {}

  @Override
  public String toString() {
    return String.format("{\"errmsg\": \"%s\", \"code\": %d}", errmsg, code);
  }

  public int getCode() {
    return code;
  }

  public ErrorCode setCode(int code) {
    this.code = code;
    return this;
  }

  public String getErrmsg() {
    return errmsg;
  }

  public ErrorCode setErrmsg(String errmsg) {
    this.errmsg = errmsg;
    return this;
  }

  public ErrorCode(int code, String errmsg) {
    this.code = code;
    this.errmsg = errmsg;
  }

}

3.声明全局异常处理类中的结果返回类

import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import com.xxx.ErrorCode;//此处引用自己errorCode类所在的包路径
import org.json.JSONObject;

public class ResultObject {	

	/**
	 * 输出错误信息
	 * @param errorCode
	 */
	public static Map<String, Object> newResultObj(ErrorCode errorCode){
		Map<String, Object> obj = new HashMap<String, Object>();
		obj.put("code", errorCode.getCode());
		obj.put("errmsg", errorCode.getErrmsg());
		return obj;
	}

	/**
	 * 输出带数据的成功信息
	 * @param data
	 */
	public static Map<String, Object> newResultObj(Object data){
		Map<String, Object> obj = new HashMap<String, Object>();
		obj.put("code", ErrorCode.SUCCESS.getCode());
		obj.put("errmsg", ErrorCode.SUCCESS.getErrmsg());
		if(null != data){
			obj.put("data", data);
		}
		return obj;
	}

	/**
	 * 输出带数据的错误信息
	 * @param errorCode
	 * @param data
	 */
	public static Map<String, Object> newResultObj(ErrorCode errorCode, Object data){
		Map<String, Object> obj = new HashMap<String, Object>();
		obj.put("code", errorCode.getCode());
		obj.put("errmsg", errorCode.getErrmsg());
		if(null != data){
			obj.put("data", data);
		}
		return obj;
	}

	/**
	 * 输出结果
	 */
	public static void outputResult(HttpServletResponse response, ErrorCode errorCode){
		try {
			JSONObject json = new JSONObject();
			json.put("code", errorCode.getCode());
			json.put("errmsg", errorCode.getErrmsg());

			response.setCharacterEncoding("UTF-8");
			response.setContentType("application/json;charset=UTF-8");
			response.getWriter().write(json.toString());
		} catch (Exception e1) {
		}
	}
}

到此这篇关于springboot框架的全局异常处理方案的文章就介绍到这了,更多相关springboot全局异常处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springboot全局异常处理详解

    一.单个controller范围的异常处理 package com.xxx.secondboot.web; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import

  • SpringBoot学习之全局异常处理设置(返回JSON)

    SpringBoot学习--全局异常处理设置(返回JSON) 需求 现在习惯使用ajax的方式发起请求,所以经常需要服务端返回一个json或者字符串. 控制全局的异常处理. 如果在单个方法中使用try,catch把方法包裹起来,工作量大,而且会异常的抛出而导致@Transactional注解的方法事务不会回滚. 说明 使用@ControllerAdvice注解 使用@ExceptionHandler注解 @ControllerAdvice 该注解是spring2.3以后新增的一个注解,主要是用来

  • Springboot之自定义全局异常处理的实现

    前言: 在实际的应用开发中,很多时候往往因为一些不可控的因素导致程序出现一些错误,这个时候就要及时把异常信息反馈给客户端,便于客户端能够及时地进行处理,而针对代码导致的异常,我们一般有两种处理方式,一种是throws直接抛出,一种是使用try..catch捕获,一般的话,如果逻辑的异常,需要知道异常信息,我们往往选择将异常抛出,如果只是要保证程序在出错的情况下 依然可以继续运行,则使用try..catch来捕获. 但是try..catch会导致代码量的增加,让后期我们的代码变得臃肿且难以维护.当

  • BGPMPLS VPN的实现技术

    BGP/MPLS VPN的实现技术 摘要 MPLS VPN技术是未来构建VPN的发展方向,越来越受到客户和运营商的青睐.BGP/MPLS VPN是第三层MPLS VPN技术.本文在对VRF.RD.RT几个重要概念进行解释之后,对BGP/MPLS VPN的数据转发过程和路由信息分发过程进行了较为详细的叙述.最后通过分析BGP/MPLS VPN的特点,分析了其市场前景. 关键词 多协议标签交换(MPLS) 虚拟局域网(VPN) 一.VPN技术概述 VPN(Virtual Private Networ

  • springboot结合全局异常处理实现登录注册验证

    在学校做一个校企合作项目,注册登录这一块需要对注册登录进行输入合法的服务器端验证,因为是前后端分离开发,所以要求返回JSON数据. 方法有很多,这觉得用全局异常处理比较容易上手 全局异常处理 首先来创建一个sprIngboot的web项目或模块,目录结构如下 实体类User.java @Data public class User { private String userName; private String passwold; } 实体类UserResult.java 把数据封装到这里返回

  • SpringBoot如何优雅的处理全局异常

    前言 本篇文章主要介绍的是SpringBoot项目进行全局异常的处理. SpringBoot全局异常准备 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. 开发准备 环境要求 JDK:1.8 SpringBoot:1.5.17.RELEASE 首先还是Maven的相关依赖: <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.

  • springboot框架的全局异常处理方案详解

    系统框架搭建的前期过程中,为了约束代码规范,我们会对一些通用功能做一些处理,比如声明一些系统公用错误类.封装通用返回结果.统一异常处理等,这样做的优势是团队开发过程中能够形成统一的代码规范,增强代码可读性,同时又便于后期代码维护.本文主要介绍下框架中异常的处理: 1.声明全局异常处理类,并添加@ControllerAdvice和@RestController注解 代码如下: @ControllerAdvice @RestController public class GlobalExceptio

  • Django与DRF结合的全局异常处理方案详解

    目录 前言 实现的目标 DRF全局异常拦截的解决思路 Django异常处理方案 总结 前言 Django 和 DRF(django rest framawork) 的结合在 python 后台中经常出现的组合.对于异常的全局处理,我们系统能有一个统一的解决方案,在开发环境能看到比较全的异常堆栈,而在生产环境能更好的给用户一个友好的提示,本文旨在提出一个统一个全局异常处理方案,仅供参考使用. 实现的目标 如果没有 DRF,我们只需要在 Django 中加一个中间件就可以解决全局异常的处理问题,但是

  • SpringBoot动态定时功能实现方案详解

    目录 业务场景 环境准备 实现方案 归纳总结 业务场景 基于上篇程序,做了一版动态定时程序,然后发现这个定时程序需要在下次执行的时候会加载新的时间,所以如果改了定时程序不能马上触发,所以想到一种方法,在保存定时程序的时候将cron表达式传过去,然后触发定时程序,下面看看怎么实现 环境准备 开发环境 JDK 1.8 SpringBoot2.2.1 Maven 3.2+ 开发工具 IntelliJ IDEA smartGit Navicat15 实现方案 基于上一版进行改进: 先根据选择的星期生成c

  • YII Framework框架教程之安全方案详解

    本文讲述了YII Framework框架的安全方案.分享给大家供大家参考,具体如下: web应用的安全问题是很重要的,在"黑客"盛行的年代,你的网站可能明天都遭受着攻击,为了从某种程度上防止被攻击,YII提供了防止攻击的几种解决方案.当然这里讲的安全是片面的,但是值得一看. 官方提供的解决方案有:如下 1. 跨站脚本攻击的防范 跨站脚本攻击(简称 XSS),即web应用从用户收集用户数据. 攻击者常常向易受攻击的web应用注入JavaScript,VBScript,ActiveX,HT

  • 详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案

    先看一道GIL面试题: 描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因. GIL:又叫全局解释器锁,每个线程在执行的过程中都需要先获取GIL,保证同一时刻只有一个线程在运行,目的是解决多线程同时竞争程序中的全局变量而出现的线程安全问题.它并不是python语言的特性,仅仅是由于历史的原因在CPython解释器中难以移除,因为python语言运行环境大部分默认在CPython解释器中. 通过

  • SpringBoot全局异常处理方案分享

    目录 一 业务场景 二 全局系统异常类 一)全局系统异常类 二) 包装异常返回结果给前端,修改自定义异常 三 返回案例 一 业务场景 调用接口时需要对属性进行校验,比如属性长度,当属性为邮箱时校验邮箱格式等,这时候要要用到@Validated注解,在使用这个注解后发现出现了一个问题,调用接口后并没有返回我们想要的报错结果,而是返回了 "message": "Validation failed for object='IMMessageSend'. Error count: 1

  • SpringBoot进行参数校验的方法详解

    目录 介绍 1.SpringBoot中集成参数校验 1.1引入依赖 1.2定义参数实体类 1.3定义校验类进行测试 1.4打开接口文档模拟提交数据 2.参数异常加入全局异常处理器 3.自定义参数校验 3.1创建自定义注解 3.2自定义校验逻辑 3.3在字段上增加注解 3.4体验效果 4.分组校验 4.1定义分组接口 4.2在模型中给参数分配分组 4.3体现效果 介绍 在日常的接口开发中,为了防止非法参数对业务造成影响,经常需要对接口的参数进行校验,例如登录的时候需要校验用户名和密码是否为空,添加

  • Mybatis 创建方法、全局配置教程详解

    总体介绍:MyBatis实际上是Ibatis3.0版本以后的持久化层框架[也就是和数据库打交道的框架]! 和数据库打交道的技术有: 原生的JDBC技术--->Spring的JdbcTemplate技术 这些工具都是提供简单的SQL语句的执行,但是和我们这里学的MyBatis框架还有些不同, 框架是一整套的东西,例如事务控制,查询缓存,字段映射等等. 我们用原生JDBC操作数据库的时候都会经过: 编写sql---->预编译---->设置参数----->执行sql------->

  • 使用SpringBoot整合ssm项目的实例详解

    SpringBoot是什么? Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程. Spring Boot 现在已经成为 Java 开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成.成为 SpringBoot 全家桶,成为一把万能钥匙. SpringBoot的特点 1.创建独立的 Spring 应用程序 2.嵌入的 Tomcat ,无需部署 WAR 文件 3.简化 Maven 配置 4.自动配置 Spr

  • springboot ehcache 配置使用方法代码详解

    EhCache是一个比较成熟的Java缓存框架,最早从hibernate发展而来, 是进程中的缓存系统,它提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案,快速简单. Springboot对ehcache的使用非常支持,所以在Springboot中只需做些配置就可使用,且使用方式也简易. 下面通过本文给大家介绍springboot ehcache 配置使用方法,具体内容如下所示: 1. pom 引入依赖 <!-- Ehcache --> <dependency

随机推荐