springboot全局异常处理方式@ControllerAdvice和@ExceptionHandler

 更新时间:2024年11月11日 14:28:00   作者:比嗨皮兔  
文章总结了个人在处理全局异常处理时的经验,包括使用`StatusEnum`来定义状态码,旨在为读者提供参考,并鼓励大家支持脚本之家

springboot全局异常处理方式

GlobalException

import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@Slf4j
@ResponseBody
@ControllerAdvice
public class GlobalException {

	/**
	 * 系统异常处理
	 *
	 * @param ex 异常
	 * @return
	 */
	@ExceptionHandler(value = Throwable.class)
	public Result defaultErrorHandler(Exception ex) {
		log.error("系统异常:{}", ex);
		return Result.error(StatusEnum.SYSTEM_ERROR);
	}

	/**
	 * BindException
	 *
	 * @param e 异常
	 * @return
	 */
	@ExceptionHandler(BindException.class)
	public Result handleBingException(BindException e) {
		FieldError fieldError = e.getFieldError();
		String message = fieldError.getDefaultMessage();
		return Result.error(StatusEnum.SYSTEM_ERROR);
	}

	/**
	 * 处理 @RequestBody参数校验异常
	 *
	 * @param e 异常信息
	 * @return
	 */
	@ExceptionHandler(MethodArgumentNotValidException.class)
	public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
		BindingResult bindingResult = e.getBindingResult();
		FieldError fieldError = bindingResult.getFieldError();
		String code = fieldError.getCode();
		String message = fieldError.getDefaultMessage();
		return Result.error(errorCode, message);
	}
}

result

@Data
public class Result<T> {

	/**
	 * 状态值
	 */
	private Boolean status;

	/**
	 * 状态码
	 */
	private String code;

	/**
	 * 状态信息
	 */
	private String message;

	/**
	 * 返回的结果
	 */
	private T result;

	/**
	 * 构造函数
	 *
	 * @param code    状态码
	 * @param message 提示信息
	 */
	public Result(String code, String message) {
		this.status = false;
		this.code = code;
		this.message = message;
	}

	/**
	 * 构造函数
	 *
	 * @param status  状态
	 * @param code    状态码
	 * @param message 提示信息
	 */
	public Result(Boolean status, String code, String message) {
		this.status = status;
		this.code = code;
		this.message = message;
	}

	/**
	 * 构造函数
	 *
	 * @param status  状态
	 * @param code    状态码
	 * @param message 提示信息
	 * @param result  结果
	 */
	public Result(Boolean status, String code, String message, T result) {
		this.status = status;
		this.code = code;
		this.message = message;
		this.result = result;
	}

	// --------- 静态方法 ----------

	/**
	 * 枚举的状态码
	 */
	private static final String CODE;

	/**
	 * 枚举的提示信息
	 */
	private static final String MESSAGE;

	/**
	 * 500
	 */
	private static final String ERROR_CODE;

	/**
	 * 成功返回的状态码
	 */
	private static final String SUCCESS_CODE;

	/**
	 * 成功返回的状态信息
	 */
	private static final String SUCCESS_MSG;

	/**
	 * 静态代码块初始化
	 */
	static {
		// 成功返回的状态码
		CODE = "getCode";
		// 枚举的提示信息
		MESSAGE = "getMessage";
		// 异常码
		ERROR_CODE = "500";
		// 成功返回的状态码
		SUCCESS_CODE = "200";
		// 成功返回的状态信息
		SUCCESS_MSG = "操作成功";
	}

	/**
	 * 操作成功
	 *
	 * @return 返回结果
	 */
	public static Result success() {
		return new Result(true, SUCCESS_CODE, SUCCESS_MSG);
	}

	/**
	 * 操作成功
	 *
	 * @return 返回结果
	 */
	public static <T> Result success(T result) {
		return new Result(true, SUCCESS_CODE, SUCCESS_MSG, result);
	}

	/**
	 * 返回异常的
	 *
	 * @param t   泛型枚举
	 * @param <T> 泛型
	 * @return 返回 result
	 */
	public static <T extends Enum> Result error(T t) {
		return error(t, CODE, MESSAGE, null);
	}

	/**
	 * 返回异常的
	 *
	 * @param t       泛型枚举
	 * @param message 提示信息
	 * @param <T>     泛型
	 * @return 返回 result
	 */
	public static <T extends Enum> Result error(T t, String message) {
		return error(t, CODE, MESSAGE, message);
	}

	/**
	 * 返回异常的
	 *
	 * @param code 状态码
	 * @return 返回 result
	 */
	public static Result error(String code) {
		return new Result(code, null);
	}

	/**
	 * 返回异常的
	 *
	 * @param code    状态码
	 * @param message 提示信息
	 * @return 返回 result
	 */
	public static Result error(String code, String message) {
		return new Result(code, message);
	}

	/**
	 * 返回异常的
	 *
	 * @param t          返回的枚举
	 * @param codeMethod 状态的方法
	 * @param msgMethod  提示信息的状态码
	 * @param <T>        泛型
	 * @return 返回 result 对象
	 */
	public static <T extends Enum> Result error(T t, String codeMethod, String msgMethod, String message) {
		try {
			Class<?> aClass = t.getClass();
			String code = aClass.getMethod(codeMethod).invoke(t).toString();
			message = StringUtils.isEmpty(message) ? aClass.getMethod(msgMethod).invoke(t).toString() : message;
			return new Result(code, message);
		} catch (Exception e) {
			return new Result(ERROR_CODE, e.getMessage());
		}
	}

	// ---- 重写的方法 ----

	/**
	 * 重写 toString 方法
	 *
	 * @return 返回JSON字符串
	 */
	@Override
	public String toString() {
		return JSON.toJSONString(this);
	}

	/**
	 * toJsonString 方法
	 *
	 * @return 返回JSON字符串
	 */
	public String toJsonString() {
		return JSON.toJSONString(this);
	}
}

StatusEnum

public enum StatusEnum {

	/**
	 * 操作成功
	 */
	OK("200", "操作成功"),

	/**
	 * 没有访问权限
	 */
	NOT_PERMISSION("403", "没有访问权限"),

	/**
	 * 没有登录或者登录已经过期
	 */
	NOT_LOGIN("405", "没有登录或者登录已经过期"),

	/**
	 * 系统繁忙,请稍后再试
	 */
	SYSTEM_ERROR("500", "系统繁忙,请稍后再试");

	/**
	 * 构造函数
	 *
	 * @param code    状态码
	 * @param message 提示信息
	 */
	StatusEnum(String code, String message) {
		this.code = code;
		this.message = message;
	}

	/**
	 * 状态码
	 */
	private String code;

	/**
	 * 提示信息
	 */
	private String message;

	/**
	 * 获取 状态码
	 *
	 * @return 状态码
	 */
	public String getCode() {
		return code;
	}

	/**
	 * 获取 提示信息
	 *
	 * @return 提示信息
	 */
	public String getMessage() {
		return message;
	}
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Struts2 $,#,%详解及实例代码

    Struts2 $,#,%详解及实例代码

    这篇文章主要介绍了Struts2 $,#,%详解及实例代码的相关资料,需要的朋友可以参考下
    2016-12-12
  • 堆排序实例(Java数组实现)

    堆排序实例(Java数组实现)

    下面小编就为大家分享一篇使用Java数组实现堆排序的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Java打印斐波那契前N项的实现示例

    Java打印斐波那契前N项的实现示例

    这篇文章主要介绍了Java打印斐波那契前N项的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 使用kotlin编写spring cloud微服务的过程

    使用kotlin编写spring cloud微服务的过程

    这篇文章主要介绍了使用kotlin编写spring cloud微服务的相关知识,本文给大家提到配置文件的操作代码,给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • IDEA导入JDBC驱动的jar包步骤详解

    IDEA导入JDBC驱动的jar包步骤详解

    JDBC是一种底层的API,是连接数据库和Java应用程序的纽带,因此我们在访问数据库时需要在业务逻辑层中嵌入SQL语句,这篇文章主要介绍了IDEA导入JDBC驱动的jar包,需要的朋友可以参考下
    2023-07-07
  • Spring Cloud详解实现声明式微服务调用OpenFeign方法

    Spring Cloud详解实现声明式微服务调用OpenFeign方法

    这篇文章主要介绍了Spring Cloud实现声明式微服务调用OpenFeign方法,OpenFeign 是 Spring Cloud 家族的一个成员, 它最核心的作用是为 HTTP 形式的 Rest API 提供了非常简洁高效的 RPC 调用方式,希望对大家有所帮助。一起跟随小编过来看看吧
    2022-07-07
  • java并发访问重复请求过滤问题

    java并发访问重复请求过滤问题

    本篇文章给大家分享了关于java并发访问重复请求过滤的相关问题以及解决方法,对此有需要的朋友参考学习下。
    2018-05-05
  • Spring Security权限管理实现接口动态权限控制

    Spring Security权限管理实现接口动态权限控制

    这篇文章主要为大家介绍了Spring Security权限管理实现接口动态权限控制,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 解决Springboot启动报错:类文件具有错误的版本61.0,应为 52.0

    解决Springboot启动报错:类文件具有错误的版本61.0,应为 52.0

    这篇文章主要给大家介绍了关于解决Springboot启动报错:类文件具有错误的版本 61.0,应为 52.0的相关资料,这是查阅了网上的很多资料才解决的,分享给大家,需要的朋友可以参考下
    2023-01-01
  • Spring AOP中使用args表达式的方法示例

    Spring AOP中使用args表达式的方法示例

    这篇文章主要介绍了Spring AOP中使用args表达式的方法,结合实例形式分析了spring面向切面AOP中使用args表达式具体步骤、相关实现技巧与操作注意事项,需要的朋友可以参考下
    2020-01-01

最新评论