SpringBoot笔记——SpringBoot自定义异常

前言

在前后端开发中,后端接口返回的数据都是JSON格式的,但是后端可能会出现一些可以未知从异常,在后端抛出这些异常的时候,也需要返回相同格式的JSON数据,这时候就需要我们设置全局异常处理器。在后端开发中,需要对一些条件做判断,也可以抛出自定义的异常。话不多说,直接上代码
代码

  1. 自定义异常
/** * 业务异常 */
public final class ServiceException extends RuntimeException {
    private static final long serialVersionUID = 1L;

    /** * 错误码 */
    private Integer code;

    /** * 错误提示 */
    private String message;

    /** * 错误明细,内部调试错误 * <p> * 和 {CommonResult # getDetailMessage()} 一致的设计 */
    private String detailMessage;

    /** * 空构造方法,避免反序列化问题 */
    public ServiceException() {
    }

    public ServiceException(String message) {
        this.message = message;
    }

    public ServiceException(String message, Integer code) {
        this.message = message;
        this.code = code;
    }

    public String getDetailMessage() {
        return detailMessage;
    }

    @Override
    public String getMessage() {
        return message;
    }

    public Integer getCode() {
        return code;
    }
    public ServiceException setMessage(String message) {
        this.message = message;
        return this;
    }
    public ServiceException setDetailMessage(String detailMessage) {
        this.detailMessage = detailMessage;
        return this;
    }
}
  1. 定义全局异常处理
import com.juxin.insureclient.common.domain.AjaxResult;
import com.juxin.insureclient.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.servlet.http.HttpServletRequest;

/** * 全局异常处理器 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    /** * 请求方式不支持 */
    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    public AjaxResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e,
                                                          HttpServletRequest request)
    {
        String requestURI = request.getRequestURI();
        log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod());
        return AjaxResult.error(e.getMessage());
    }
    /** * 业务异常 */
    @ExceptionHandler(ServiceException.class)
    public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request)
    {
        log.error(e.getMessage(), e);
        Integer code = e.getCode();
        return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage());
    }
    /** * 拦截未知的运行时异常 */
    @ExceptionHandler(RuntimeException.class)
    public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request)
    {
        String requestURI = request.getRequestURI();
        log.error("请求地址'{}',发生未知异常.", requestURI, e);
        return AjaxResult.error(e.getMessage());
    }
    /** * 系统异常 */
    @ExceptionHandler(Exception.class)
    public AjaxResult handleException(Exception e, HttpServletRequest request)
    {
        String requestURI = request.getRequestURI();
        log.error("请求地址'{}',发生系统异常.", requestURI, e);
        return AjaxResult.error(e.getMessage());
    }
}

3.返回消息格式

import com.juxin.insureclient.common.constant.HttpStatus;
import com.juxin.insureclient.common.utils.StringUtils;

import java.util.HashMap;

/** * 操作消息提醒 */
public class AjaxResult extends HashMap<String, Object> {
    private static final long serialVersionUID = 1L;

    /** * 状态码 */
    public static final String CODE_TAG = "code";

    /** * 返回内容 */
    public static final String MSG_TAG = "msg";

    /** * 数据对象 */
    public static final String DATA_TAG = "data";

    /** * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。 */
    public AjaxResult() {
    }

    /** * 初始化一个新创建的 AjaxResult 对象 * * @param code 状态码 * @param msg 返回内容 */
    public AjaxResult(int code, String msg) {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
    }

    /** * 初始化一个新创建的 AjaxResult 对象 * * @param code 状态码 * @param msg 返回内容 * @param data 数据对象 */
    public AjaxResult(int code, String msg, Object data) {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
        if (StringUtils.isNotNull(data)) {
            super.put(DATA_TAG, data);
        }
    }

    /** * 返回成功消息 * * @return 成功消息 */
    public static AjaxResult success() {
        return AjaxResult.success("操作成功");
    }

    /** * 返回成功数据 * * @return 成功消息 */
    public static AjaxResult success(Object data) {
        return AjaxResult.success("操作成功", data);
    }

    /** * 返回成功消息 * * @param msg 返回内容 * @return 成功消息 */
    public static AjaxResult success(String msg) {
        return AjaxResult.success(msg, null);
    }

    /** * 返回成功消息 * * @param msg 返回内容 * @param data 数据对象 * @return 成功消息 */
    public static AjaxResult success(String msg, Object data) {
        return new AjaxResult(HttpStatus.SUCCESS, msg, data);
    }

    /** * 返回警告消息 * * @param msg 返回内容 * @return 警告消息 */
    public static AjaxResult warn(String msg) {
        return AjaxResult.warn(msg, null);
    }

    /** * 返回警告消息 * * @param msg 返回内容 * @param data 数据对象 * @return 警告消息 */
    public static AjaxResult warn(String msg, Object data) {
        return new AjaxResult(HttpStatus.WARN, msg, data);
    }

    /** * 返回错误消息 * * @return */
    public static AjaxResult error() {
        return AjaxResult.error("操作失败");
    }

    /** * 返回错误消息 * * @param msg 返回内容 * @return 警告消息 */
    public static AjaxResult error(String msg) {
        return AjaxResult.error(msg, null);
    }

    /** * 返回错误消息 * * @param msg 返回内容 * @param data 数据对象 * @return 警告消息 */
    public static AjaxResult error(String msg, Object data) {
        return new AjaxResult(HttpStatus.ERROR, msg, data);
    }

    /** * 返回错误消息 * * @param code 状态码 * @param msg 返回内容 * @return 警告消息 */
    public static AjaxResult error(int code, String msg) {
        return new AjaxResult(code, msg, null);
    }

    /** * 链式调用 * * @param key 键 * @param value 内容 * @return 警告消息 */
    @Override
    public AjaxResult put(String key, Object value) {
        super.put(key, value);
        return this;
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊健的影子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值