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全局自定义异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决Weblogic部署war找不到spring配置文件的问题

    解决Weblogic部署war找不到spring配置文件的问题

    这篇文章主要介绍了解决Weblogic部署war找不到spring配置文件的问题,具有很好的参考价值,希望对大家有所帮助。
    2021-07-07
  • MybatisPlus保存、读取MySQL中的json字段失败问题及解决

    MybatisPlus保存、读取MySQL中的json字段失败问题及解决

    这篇文章主要介绍了MybatisPlus保存、读取MySQL中的json字段失败问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • SpringBoot整合MyBatisPlus详解

    SpringBoot整合MyBatisPlus详解

    这篇文章详细介绍了SpringBoot整合mybatisplus的全过程,文中有详细的代码示例,具有一定的参考价值,需要的朋友可以参考一下
    2023-04-04
  • Java中的==和equals()区别小结

    Java中的==和equals()区别小结

    在Java编程中,理解==操作符和equals()方法的区别是至关重要的,本文主要介绍了Java中的==和equals()区别,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • 整理很详细的Java正则表达式使用大全

    整理很详细的Java正则表达式使用大全

    这篇文章为大家整理了很详细的Java正则表达式使用大全,大家在使用Java正则表达式的时候可查阅这篇文章,认为不错的朋友可以收藏起来
    2015-12-12
  • Spring Boot 搭建 ELK正确看日志的配置流程

    Spring Boot 搭建 ELK正确看日志的配置流程

    这篇文章主要介绍了Spring Boot 搭建 ELK正确看日志的配置流程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 你知道怎么用Spring的三级缓存解决循环依赖吗

    你知道怎么用Spring的三级缓存解决循环依赖吗

    这篇文章主要为大家详细介绍了Spring的三级缓存解决循环依赖,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • Spring Cloud 2020.0.0正式发布再见了Netflix

    Spring Cloud 2020.0.0正式发布再见了Netflix

    这篇文章主要介绍了Spring Cloud 2020.0.0正式发布再见了Netflix,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Java实现多个单张tif文件合并成一个多页tif文件

    Java实现多个单张tif文件合并成一个多页tif文件

    业务部门需要将多个单张的tiff文件,合并成一个多页的tiff文件,本文就来介绍一下如何实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • Java调用腾讯云短信API接口的实现

    Java调用腾讯云短信API接口的实现

    这篇文章主要介绍了Java调用腾讯云短信API接口的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论