Spring如何优雅的实现返回结果封装

优雅的实现接口返回信息包封装


前言

接触了不少项目,总结一下感觉比较好的接口返回消息包封装实现。

一、结果消息枚举

对不同业务模块的 返回信息枚举 进行统一管理


代码如下(示例):
/**
 * 统一接口
 */
public interface IResultMessageEnum<C extends Enum> {
     Integer getCode();
     String getMsg();
}

/**
 * 系统模块枚举
 */
 public enum SysResultMessageEnum implements IResultMessageEnum {

    SUCCESS(0, "成功"),
    FAIL(-1, "失败");

    private final Integer code;
    private final String msg;

    SysResultMessageEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

}

/**
 * 订单模块枚举
 */
 public enum OrderResultMessageEnum implements IResultMessageEnum {

    SUCCESS(100, "下单成功"),
    FAIL(200, "下单失败");

    private final Integer code;
    private final String msg;

    OrderResultMessageEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

}

/**
 * 消息返回VO (测试用)
 */
 public class ResultVO 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";

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

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

    public static ResultVO response(IResultMessageEnum resultMessageEnum) {
        return new ResultVO(resultMessageEnum.getCode(), resultMessageEnum.getMsg());
    }

    @Override
    public String toString() {
        return "ResultVO{Code:"+super.get("code")+",Msg:"+super.get("msg")+"}";
    }
}

/**
  * 测试Main方法 ResultVO response 方法可读取实现统一接口的枚举类
  */
public class Test {

    public static void main(String[] args) {

        // 获取枚举返回对象
        ResultVO sysResultVO = ResultVO.response(SysResultMessageEnum.SUCCESS);
        System.out.println(sysResultVO.toString());
        ResultVO orderResultVO = ResultVO.response(OrderResultMessageEnum.SUCCESS);
        System.out.println(orderResultVO.toString());

    }

}

二、自定义消息返回异常

在异常中组装消息返回对象数据,异常即可返回枚举中异常Code及Msg。


代码如下(示例):

package com.mofang.Exception;

import com.mofang.contants.ResultMessageEnum;

/**
  * 自定义异常消息返回 统一处理方法抛出的异常
  *
  * @param e
  * @return
  */
@ExceptionHandler(BaseException.class)
public ResultVO BaseException(BaseException e) {
    BaseException baseException = (BaseException) e;
    return new ResultVO(baseException.getCode(),baseException.getMsg());
}
    
/**
 * 自定义通用异常处理
 *
 * @author 花寻
 * @date 2021/6/18 11:21
 * @copyright 2021 mofang. All rights reserved
 */
public class BaseException extends RuntimeException{
    private static final long serialVersionUID = -4339089124482735173L;

    /**
     * 具体异常码
     */
    protected Integer code;

    /**
     * 异常信息
     */
    protected String msg;

    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    public BaseException(Integer code, String defaultMessage) {
        this.code = code;
        this.msg = defaultMessage;
    }

    public BaseException(IResultMessageEnum resultMessageEnum) {
        this(resultMessageEnum.getCode(), resultMessageEnum.getMsg());
    }

}

// 使用方法
throw new BaseException(SysResultMessageEnum.FAIL);

总结

业务异常可以非常方便的返回错误信息 ,对大量返回信息可以分枚举类进行管理,便于维护及使用。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值