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

 更新时间:2021年03月12日 14:27:58   作者:一起随缘  
这篇文章主要介绍了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全局异常处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 教你在 Java 中实现 Dijkstra 最短路算法的方法

    教你在 Java 中实现 Dijkstra 最短路算法的方法

    这篇文章主要教你在 Java 中实现 Dijkstra 最短路算法的方法,在实现最短路算法之前需要先实现带权有向图,文章中给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • MybatisPlus代码生成器使用示例

    MybatisPlus代码生成器使用示例

    MyBatis-Plus自动化的生成与数据库表对应的Java代码文件,本文主要介绍了MybatisPlus代码生成器使用示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • 使用GenericObjectPool避免泄漏设置方法

    使用GenericObjectPool避免泄漏设置方法

    这篇文章主要为大家介绍了使用GenericObjectPool避免泄漏的设置方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Java实现按照大小写字母顺序排序的方法

    Java实现按照大小写字母顺序排序的方法

    这篇文章主要介绍了Java实现按照大小写字母顺序排序的方法,涉及java数组遍历、编码转换、判断等相关操作技巧,需要的朋友可以参考下
    2017-12-12
  • Java文档注释超详细讲解

    Java文档注释超详细讲解

    这篇文章主要给大家介绍了关于Java文档注释的相关资料,文档注释主要是用来生成java开发文档javadoc的,生成的开发文档和Java本身的API帮助文档是一样的,需要的朋友可以参考下
    2023-10-10
  • springboot如何获取application.yml里值的方法

    springboot如何获取application.yml里值的方法

    这篇文章主要介绍了springboot如何获取application.yml里的值,文章围绕主题相关自资料展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • Java8并发新特性CompletableFuture

    Java8并发新特性CompletableFuture

    这篇文章主要介绍了Java8并发新特性CompletableFuture,CompletableFuture针对Future接口做了改进,相比Callable/Runnable接口它支持多任务进行链式调用、组合、多任务并发处理,下面文章更多相关内容得介绍,需要的小伙伴可以参考一下
    2022-06-06
  • Springboot项目升级2.2.x升至2.7.x的示例代码

    Springboot项目升级2.2.x升至2.7.x的示例代码

    本文主要介绍了Springboot项目升级2.2.x升至2.7.x的示例代码,会有很多的坑,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • SpringBoot自动配置源码深入刨析讲解

    SpringBoot自动配置源码深入刨析讲解

    这篇文章主要介绍了SpringBoot自动配置原理分析,SpringBoot是我们经常使用的框架,那么你能不能针对SpringBoot实现自动配置做一个详细的介绍。如果可以的话,能不能画一下实现自动配置的流程图。牵扯到哪些关键类,以及哪些关键点
    2022-09-09
  • Java读写Excel实例分享

    Java读写Excel实例分享

    本文主要分享了Java读写Excel的实例代码。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01

最新评论