SpringBoot统一异常处理与统一响应结果集(使用笔记)

 

目录

一、编写异常信息枚举类

二、编写自定义业务异常

三、在Service层使用自定义异常

四、编写统一响应结果类

五、编写处理返回给客户端结果的工具类

六、编写全局异常处理器


此处主要对统一异常处理的方法和步骤进行详细笔记总结

一、编写异常信息枚举类

此处枚举的具体内容根据自己的业务需要进行添加,此处的状态码值自己设置,一般也可以使用HttpStatus的状态码,那个和HTTP协议的规范一直,如2xx表示请求成功,4xx表示资源找不到,500表示服务器错误等等,

public enum ResultEnum {
    /** 成功 */
    REQUEST_SUCCESS(200,"成功"),

    /** 失败  */
    REQUEST_FAILED(-1,"失败"),

    /** 未知错误   */
    UNKNOWN_ERROR(500,"未知错误");


    /** 状态  */
    private Integer code;
    /** 含义 */
    private String message;

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

    public Integer getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

二、编写自定义业务异常

一般自定义异常的属性信息都是通过构造方法,所以此处不需要set方法,一般自定义异常继承RuntimeException,而异常信息传参通过上一步定义的枚举对象

public class BusinessException extends RuntimeException{

    private static final long serialVersionUID = -1260775338752265332L;

    /** 异常状态码  */
    private Integer code;

    public BusinessException(ResultEnum resultEnum) {
        super(resultEnum.getMessage());
        this.code = resultEnum.getCode();
    }

    public Integer getCode() {
        return code;
    }

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

三、在Service层使用自定义异常

在自定义业务异常中指定枚举中管理的各种业务异常信息

    @Override
    public void save(Girl girl) {
        Girl g = girlRepository.save(girl);
        Optional<Girl> girlOptional = Optional.of(girl);
        if(girlOptional.isPresent()){
            throw new BusinessException(ResultEnum.REQUEST_FAILED);
        }
    }

四、编写统一响应结果类

public class Result<T> implements Serializable {

    private static final long serialVersionUID = -7557258753883492883L;

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

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

    /** 返回数据  */
    private T data;

    public Integer getCode() {
        return code;
    }

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

    public String getMsg() {
        return msg;
    }

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

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "Result{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }
}

五、编写处理返回给客户端结果的工具类

编写包含静态方法的工具类,抽取业务的重复代码部分进行封装

public class ResultUtil {

    /**
     * 处理请求成功,返回数据
     *
     * @param o 具体数据
     * @return 返回统一响应结果
     */
    public static Result<Object> success(Object o){
        Result<Object> girlResult = new Result<>();
        girlResult.setCode(1);
        girlResult.setMsg("成功");
        girlResult.setData(o);
        return girlResult;
    }

    /**
     * 处理请求成功,无数据返回
     *
     * @return 返回统一响应结果
     */
    public static Result<Object> success(){
        return success(null);
    }

    /**
     * 失败请求
     *
     * @return 返回统一响应结果
     */
    public static Result<Object> error(Integer code,String msg){
        Result<Object> objectResult = new Result<>();
        objectResult.setCode(code);
        objectResult.setMsg(msg);
        objectResult.setData(null);
        return objectResult;
    }

}

六、编写全局异常处理器

此处如果是返回统一响应结果的,则使用@RestControllerAdvice注解处理器类,如果需要返回页面的,则使用@ControllerAdvice,这里@ExceptionHandler指定处理的异常类型,一般如果项目的异常处理写的详细一点的话,还会添加认证异常、授权异常、参数校验异常,这里就不添加,网上太多这类博客了

@RestControllerAdvice
public class GlobalExceptionHandler {

    /** 打印日志  */
    private static final Logger log= LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /**
     * 统一异常处理
     *
     * @param e 异常对象
     * @return 统一响应结果
     */
    @ExceptionHandler(value = Exception.class)
    public Result<Object> handleException(Exception e){
        if (e instanceof BusinessException){
            BusinessException businessException=(BusinessException) e;
            return ResultUtil.error(businessException.getCode(),e.getMessage());
        }
        log.error(" 系统异常 {} ",e);
        return ResultUtil.error(-1,"未知错误,请联系系统管理员!");
    }
}

此处只是针对个人以后使用做的笔记,没有太多详细的解读,仅供参考

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值