Springboot项目统一异常处理
Springboot项目统一异常处理
一.接口返回值封装
1. 定义Result对象,作为通用返回结果封装
2. 定义CodeMsg对象,作为通用状态码和消息封装
二.定义全局异常类
三.定义异常处理类
四.特殊处理404异常
五.测试使用效果
一.接口返回值封装
基于目前大多数项目都采用前后端分离架构,所以后端接口统一返回值封装是比较重要的,便于前后端对接与统一处理。当然按各自项目约定实现即可,思路大同小异,下面是我的实现方式,仅供参考
1. 定义Result对象,作为通用返回结果封装
/**
*
@filename Result
*
*
@description 通用返回结果封装
*
* @author llspace
* @version 1.0
* @since 2019/6/17 11:55
**/
@Data
public class Result {
private int code;
private String msg;
private T data;
/**
* 成功时候的调用
*/
public static Result success(T data) {
return new Result(data);
}
/**
* 失败时候的调用
*/
public static Result error(CodeMsg cm) {
return new Result(cm);
}
private Result(T data) {
this.code = 0;
this.msg = "success";
this.data = data;
}
private Result(CodeMsg cm) {
if (cm == null) {
return;
}
this.code = cm.getCode();
this.msg = cm.getMsg();
}
}
2. 定义CodeMsg对象,作为通用状态码和消息封装
/**
*
@filename CodeMsg
*
*
@description 通用状态码和消息封装
*
* @author llspace
* @version 1.0
* @since 2019/6/17 11:57
**/
@Data
public class CodeMsg {
//自定义状态码
private int code;
//消息信息
private String msg;
//通用异常 4001XX
public static CodeMsg SUCCESS = new CodeMsg(0, "success");
public static CodeMsg SERVER_ERROR = new CodeMsg(500100, "服务端异常");
//模块1 4002XX
//模块2 4003XX
//模块3 4004XX
private CodeMsg(int code, String msg) {
this.code = code;
this.msg = msg;
}
public CodeMsg fillArgs(Object... args) {
int code = this.code;
String message = String.format(this.msg, args);
return new CodeMsg(code, message);
}
}
二.定义全局异常类
基于上面封装的CodeMsg实现GlobalException定义,异常继承RuntimeException
/**
*
@filename GlobalException
*
*
@description 全局异常信息
*
* @author llspace
* @version 1.0
* @since 2019/6/20 18:05
**/
@Data
public class GlobalException extends RuntimeException {
private static final long serialVersionUID = 1L;
private CodeMsg codeMsg;
public GlobalException(CodeMsg codeMsg) {
super(codeMsg.toString());
this.codeMsg = codeMsg;
}
}
三.定义异常处理类
@RestControllerAdvice作用等同于@ResponseBody加上@ControllerAdvice,会在所有带有@Controller或者@RestController注解的类上生效,还可以使用basePackages参数配置指定异常处理类生效的包
/**
*
@filename GlobalExceptionHandler
*
*
@description 全局异常处理类
*
* @author llspace
* @version 1.0
* @since 2019/6/20 18:07
**/
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public Result exceptionHandler(HttpServletRequest request, Exception e){
e.printStackTrace();
if(e instanceof GlobalException) {
GlobalException exception = (GlobalException) e;
return Result.error(exception.getCodeMsg());
}else if(e instanceof BindException) {
BindException ex = (BindException) e;
List errors = ex.getAllErrors();
ObjectError error = errors.get(0);
String msg = error.getDefaultMessage();
return Result.error(CodeMsg.BIND_ERROR.fillArgs(msg));
}else {无锡妇科医院哪家好 http://mobile.xasgyy.net/
return Result.error(CodeMsg.SERVER_ERROR);
}
}
四.特殊处理404异常
spring boot默认不会抛出404异常(NoHandlerFoundException),所以在ControllerAdvice中捕获不到该异常,导致404总是跳过ContollerAdvice,直接显示ErrorController的错误页。需要改变配置,让404错误抛出异常(NoHandlerFoundException),这样便可在ControllerAdvice中捕获此异常。
如果是restful项目改变配置即可实现捕获上述异常,在application.yml中添加:
spring:
mvc:
throw-exception-if-no-handler-found: true
resources:
add-mappings: false
注意:添加了如上配置会造成项目静态资源访问异常, 如果不是restful的项目这样配置就会有问题,所以就需要采用其他方式来处理了, 可以参考如下处理方法
如果是带静态资源的项目我们要如何来处理404异常呢?
断点下BasicErrorController类,查看下源码可知,errorHtml()方法默认会返回一个new ModelAndView(“error”, model),所以其实在classpath:/templates下自定义一个error.html即可,这样springboot默认的404错误就跳转到了自己项目下的error页面了,这种处理比较简单,如果想更好的封装错误页面,建议自己实现ErrorController接口,或者继承AbstractErrorController / BasicErrorController类来实现,当然前提是删除掉配置文件中上述的两个配置
五.测试使用效果
至此,统一异常处理就实现了,如下使用,
if(loginVO == null) {
throw new GlobalException(CodeMsg.SERVER_ERROR);
}
这样会抛出异常如下:
GlobalException(codeMsg=CodeMsg(code=500100, msg=服务端异常))
如果是404异常会跳项目自定义的error页面
个人实现,仅供参考,有兴趣的小伙伴自己动手尝试吧!
Springboot项目统一异常处理的更多相关文章
- springmvc、 springboot 项目全局异常处理
异常在项目中那是不可避免的,通常情况下,我们需要对全局异常进行处理,下面介绍两种比较常用的情况. 准备工作: 在捕获到异常的时候,我们通常需要返回给前端错误码,错误信息等,所以我们需要手动封装一个js ...
- SpringBoot之统一异常处理
异常,不仅仅是程序运行状态的描述,还可以使得代码编写更加的规范 1.自定义异常:FieldValueInvalidException package com.geniuses.sewage_zer ...
- 从零开始的SpringBoot项目 ( 七 ) 统一返回结果集Result 和 异常处理
import java.io.Serializable; import lombok.Data; import org.springframework.http.HttpStatus; @Data p ...
- 配置springboot在访问404时自定义返回结果以及统一异常处理
在搭建项目框架的时候用的是springboot,想统一处理异常,但是发现404的错误总是捕捉不到,总是返回的是springBoot自带的错误结果信息. 如下是springBoot自带的错误结果信息: ...
- springboot中web应用的统一异常处理
在web应用中,请求处理过程中发生异常是非常常见的情况.springboot为我们提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异 ...
- SpringBoot入门系列(十一)统一异常处理的实现
前面介绍了Spring Boot 如何整合定时任务已经Spring Boot 如何创建异步任务和定时任务.不清楚的朋友可以看看之前的文章:<Spring Boot 入门系列文章> 接下来主 ...
- SpringBoot系列(十)优雅的处理统一异常处理与统一结果返回
SpringBoot系列(十)统一异常处理与统一结果返回 往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列 ...
- Java 项目创建 -- 统一结果处理、统一异常处理、统一日志处理
一.IDEA 插件使用 1.说明 此处使用 SpringBoot 2.2.6 .JDK 1.8 .mysql 8.0.18 作为演示. 使用 IDEA 作为开发工具. 2.IDEA 插件 -- Lom ...
- SpringBoot系列——自定义统一异常处理
前言 springboot内置的/error错误页面并不一定适用我们的项目,这时候就需要进行自定义统一异常处理,本文记录springboot进行自定义统一异常处理. 1.使用@ControllerAd ...
随机推荐
- 【转】谈谈servlet、spring、struts
今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...
- how does SELECT TOP works when no order by is specified?
how does SELECT TOP works when no order by is specified? There is no guarantee which two rows you ge ...
- jmeter BeanShell断言(三)数据处理
在做接口测试时,对响应数据的校验是非常重要的部分:在使用Jmeter进行接口测试时,有多种respone校验方式,比如响应断言.BeanShell断言等等,BeanShell断言可以自定义断言,自由灵 ...
- 025_Excel知识汇总
一.Excel相对引用和绝对应用的区别 加上了绝对地址符“$”的列标和行号为绝对地址,在公式向旁边复制时不会发生变化,没有加上绝对地址符号的列标和行号为相对地址,在公式向旁边复制时会跟着发生变化. 具 ...
- [译]如何在红帽系统(RHEL)上源码安装python3?
原文来源: https://stackoverflow.com/questions/8087184/installing-python-3-on-rhel 很容易手动安装. 1.下载对应的python ...
- LeetCode_447. Number of Boomerangs
447. Number of Boomerangs Easy Given n points in the plane that are all pairwise distinct, a "b ...
- k8s添加凭证
请参照:https://www.cnblogs.com/effortsing/p/10013441.html
- Python微服务实践-集成Consul配置中心
A litmus test for whether an app has all config correctly factored out of the code is whether the co ...
- Deploy != Release(第一部分):部署与发布的区别,以及为什么这很重要
原文地址:http://ju.outofmemory.cn/entry/351873 翻译自: Deploy != Release (Part 1): The difference between d ...
- 【神经网络与深度学习】【计算机视觉】SPPNet-引入空间金字塔池化改进RCNN
转自: https://zhuanlan.zhihu.com/p/24774302?refer=xiaoleimlnote 继续总结一下RCNN系列.上篇RCNN- 将CNN引入目标检测的开山之作 介 ...