Springboot实现全局自定义异常的方法详解

 更新时间:2023年11月14日 10:00:56   作者:huayang183  
这篇文章主要介绍了Springboot实现全局自定义异常的方法详解,SpringBoot的项目已经对有一定的异常处理了,但是对于我们开发者而言可能就不太合适了,因此我们需要对这些异常进行统一的捕获并处理,需要的朋友可以参考下

前言

SpringBoot的项目已经对有一定的异常处理了,但是对于我们开发者而言可能就不太合适了,因此我们需要对这些异常进行统一的捕获并处理。SpringBoot中有一个ControllerAdvice的注解,使用该注解表示开启了全局异常的捕获,我们只需在自定义一个方法使用ExceptionHandler注解然后定义捕获异常的类型即可对这些捕获的异常进行统一的处理。

自定义基础接口类

定义一个基础的接口类,自定义的错误描述枚举类需实现该接口。

代码如下:

public interface BaseErrorInfoInterface {
    /** 错误码
     */
    String getCode();

    /** 错误描述*/
    String getMsg();
}

自定义枚举类

然后自定义一个枚举类,并实现该接口。

代码如下:

import lombok.Getter;
@Getter
public enum ErrorCodeAndMsg  implements BaseErrorInfoInterface{
    SUCCESS("200", "成功!"),
    BODY_NOT_MATCH("400","请求的数据格式不符!"),
    SIGNATURE_NOT_MATCH("401","请求的数字签名不匹配!"),
    NOT_FOUND("404", "未找到该资源!"),
    INTERNAL_SERVER_ERROR("500", "服务器内部错误!"),
    SERVER_BUSY("503","服务器正忙,请稍后再试!"),
    STUDENG_NULL("0003", "学号不能为空");
    private String code;
    private String msg;
    ErrorCodeAndMsg(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    public String getCode() {
        return code;
    }
    public String getMsg() {
        return msg;
    }
}

自定义异常类

定义一个异常类,用于处理我们发生的业务异常。

代码如下:

import lombok.Getter;

/**
 * 统一异常捕获类
 * Created by Tiger on 2018/10/9.
 */
@Getter
public class StudentException extends RuntimeException{
    private String code;
    private String msg;
    public StudentException() {
        super();
    }

    public StudentException(BaseErrorInfoInterface errorInfoInterface) {
        super(errorInfoInterface.getCode());
        this.code = errorInfoInterface.getCode();
        this.msg = errorInfoInterface.getMsg();
    }

    public StudentException(BaseErrorInfoInterface errorInfoInterface, Throwable cause) {
        super(errorInfoInterface.getCode(), cause);
        this.code = errorInfoInterface.getCode();
        this.msg = errorInfoInterface.getMsg();
    }

    public StudentException(String errorMsg) {
        super(errorMsg);
        this.msg = errorMsg;
    }

    public StudentException(String errorCode, String errorMsg) {
        super(errorCode);
        this.code = errorCode;
        this.msg = errorMsg;
    }

    public StudentException(String errorCode, String errorMsg, Throwable cause) {
        super(errorCode, cause);
        this.code = errorCode;
        this.msg = errorMsg;
    }


    public String getErrorCode() {
        return code;
    }

    public void setErrorCode(String errorCode) {
        this.code = errorCode;
    }

    public String getErrorMsg() {
        return msg;
    }

    public void setErrorMsg(String errorMsg) {
        this.msg = errorMsg;
    }

    public String getMessage() {
        return msg;
    }

    @Override
    public Throwable fillInStackTrace() {
        return this;
    }
}

自定义数据格式

顺便这里定义一下数据的传输格式。

代码如下:

public class ResultBody {
    /**
     * 响应代码
     */
    private String code;

    /**
     * 响应消息
     */
    private String message;

    /**
     * 响应结果
     */
    private Object result;

    public ResultBody() {
    }



    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getResult() {
        return result;
    }

    public void setResult(Object result) {
        this.result = result;
    }

    /**
     * 成功
     *
     * @return
     */
    public static ResultBody success() {
        return success(null);
    }

    /**
     * 成功
     * @param data
     * @return
     */
    public static ResultBody success(Object data) {
        ResultBody rb = new ResultBody();
        rb.setCode(ErrorCodeAndMsg.SUCCESS.getCode());
        rb.setMessage(ErrorCodeAndMsg.SUCCESS.getMsg());
        rb.setResult(data);
        return rb;
    }

    /**
     * 失败
     */
    public static ResultBody error(BaseErrorInfoInterface errorInfo) {
        ResultBody rb = new ResultBody();
        rb.setCode(errorInfo.getCode());
        rb.setMessage(errorInfo.getMsg());
        rb.setResult(null);
        return rb;
    }

    /**
     * 失败
     */
    public static ResultBody error(String code, String message) {
        ResultBody rb = new ResultBody();
        rb.setCode(code);
        rb.setMessage(message);
        rb.setResult(null);
        return rb;
    }

    /**
     * 失败
     */
    public static ResultBody error( String message) {
        ResultBody rb = new ResultBody();
        rb.setCode("-1");
        rb.setMessage(message);
        rb.setResult(null);
        return rb;
    }

    /*@Override
    public String toString() {
        return JSONObject.toJSONString(this);
    }*/
}

自定义全局异常处理类

最后我们在来编写一个自定义全局异常处理的类。

代码如下:

@ControllerAdvice
public class GlobalExceptionHandler {
	private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
	/**
	 * 处理自定义的业务异常
	 * @param req
	 * @param e
	 * @return
	 */
    @ExceptionHandler(value = BizException.class)  
    @ResponseBody  
	public  ResultBody bizExceptionHandler(HttpServletRequest req, BizException e){
    	logger.error("发生业务异常!原因是:{}",e.getErrorMsg());
    	return ResultBody.error(e.getErrorCode(),e.getErrorMsg());
    }
	/**
	 * 处理空指针的异常
	 * @param req
	 * @param e
	 * @return
	 */
	@ExceptionHandler(value =NullPointerException.class)
	@ResponseBody
	public ResultBody exceptionHandler(HttpServletRequest req, NullPointerException e){
		logger.error("发生空指针异常!原因是:",e);
		return ResultBody.error(CommonEnum.BODY_NOT_MATCH);
	}
    /**
        * 处理其他异常
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value =Exception.class)
	@ResponseBody
	public ResultBody exceptionHandler(HttpServletRequest req, Exception e){
    	logger.error("未知异常!原因是:",e);
       	return ResultBody.error(CommonEnum.INTERNAL_SERVER_ERROR);
    }
} 

到此这篇关于Springboot实现全局自定义异常的方法详解的文章就介绍到这了,更多相关Springboot全局自定义异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mybatis使用@mapkey获取的结果的键(key)为null问题

    mybatis使用@mapkey获取的结果的键(key)为null问题

    这篇文章主要介绍了mybatis使用@mapkey获取的结果的键(key)为null问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Java实现设计模式之责任链模式

    Java实现设计模式之责任链模式

    责任链模式是一种行为设计模式,允许你将请求沿着处理链发送,然后处理者都可对其进行处理,完成后可以再将其传递给下一个处理者。下面将会举例说明什么是责任链模式,责任链模式该如何使用
    2022-08-08
  • 详解SpringBoot中自定义starter的开发与使用

    详解SpringBoot中自定义starter的开发与使用

    starter是SpringBoot中非常重要的一个机制,他是基于约定优于配置的思想所衍生出来的,本文主要介绍了SpringBoot中自定义starter的开发与使用,感兴趣的可以了解下
    2023-09-09
  • Java设计模式之代理模式解析

    Java设计模式之代理模式解析

    这篇文章主要介绍了Java设计模式之代理模式解析,代理模式为一个对象提供一个替身,以控制对这个对象的访问,即通过代理对象访问目标对象,需要的朋友可以参考下
    2023-12-12
  • Spring Boot 启动流程解析

    Spring Boot 启动流程解析

    Spring Boot 是一个简化的 Spring 应用开发框架,它以 “约定优于配置” 的理念,为开发者提供了开箱即用的功能,本文将详细剖析其内部实现,帮助你深入理解 Spring Boot 的启动机制,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • Ubuntu16.04 64位下JDK1.7的安装教程

    Ubuntu16.04 64位下JDK1.7的安装教程

    这篇文章主要为大家详细介绍了Ubuntu16.04 64位下JDK1.7的安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • 关于连接池详解(HikariCP、Druid)

    关于连接池详解(HikariCP、Druid)

    这篇文章主要介绍了关于连接池详解(HikariCP、Druid),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • java的java.security.egd源码解读

    java的java.security.egd源码解读

    这篇文章主要为大家介绍了java的java.security.egd源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • MyBatis查询结果resultType返回值类型的说明

    MyBatis查询结果resultType返回值类型的说明

    这篇文章主要介绍了MyBatis查询结果resultType返回值类型的说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • 为什么wait和notify必须放在synchronized中使用

    为什么wait和notify必须放在synchronized中使用

    这篇文章主要介绍了为什么wait和notify必须放在synchronized中使用,文章围绕主题的相关问题展开详细介绍,具有一定的参考价值,需要的小伙伴可以参考以参考一下
    2022-05-05

最新评论