可维护的返回码

9/7/2021

# 缘由

常见在前端调用后端api接口时通常有如下三个字段:

code: 1,               1表示成功,0表示错误
message:"成功"
data:{}
1
2
3

code值为1和0来区分成功或者失败,也有人用Http的code,200表示成功等等。

但是考虑下分布式的场景,服务比较多,场景比较多,业务相对复杂点,当你调用其他服务的接口,需要在某个特定的场景下做一些事情的时候,需要怎么区分,或者可以看看其他开放平台接口。比如微信,支付宝等等,你会发现都会对不同的返回结果有个特殊的返回码。

所以如果对于一个长期维护的产品而言,把返回码维护好是非常重要的和必要的。

# 返回码维护的好处

  • 便于长期维护
  • 避免在java代码中直接写字符串,不符合阿里规约
  • 便于将来的服务拆分和扩展
  • 便于与其他系统进行对接和开放接口
  • 便于前端做更加细致的操作
  • 暂时想到这么多

# ResponseCodeConst类设计

希望有个地方来维护这些返回码,通常最简单的想法是放到一个常量类或者枚举enum类里面,想法挺好,但是这样又有些问题:

  1. 怎么避免返回码的重复?
  2. 业务多会导致这个类特别大,难维护
  3. 如何定义范围?

带着以上问题可以总结如下:

  • 为避免类特别大,必须放到多个类里面
  • 必须要有范围的定义和说明
  • 必须要有全局的码值和避免范围重复的检测机制

所以 ResponseCodeConst 类横空出世。

# 1、代码如下
public class ResponseCodeConst {

    // 范围声明
    static {
        // 通用业务范围,从0开始,step=1000
        ResponseCodeContainer.register(ResponseCodeConst.class, 0, 1000);
        // 登录业务
        ResponseCodeContainer.register(LoginResponseCodeConst.class, 1001, 2000);
        // 部门业务
        ResponseCodeContainer.register(DepartmentResponseCodeConst.class, 2001, 3000);
        //其他
    }

    public static final ResponseCodeConst SUCCESS = new ResponseCodeConst(1, "success", true);
    public static final ResponseCodeConst COMMON_ERROR = new ResponseCodeConst(2, "我错了....");
    public static final ResponseCodeConst ERROR_PARAM = new ResponseCodeConst(101, "参数异常!");

    protected int code;
    protected String msg;
    protected boolean success;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 2、ResponseCodeConst基类
  • 定义基本属性
  • 定义各个业务code范围
  • 进行范围和重复检测
  • 通用的范围code定义到基类
# 3、范围声明

对于每个业务模块的XxxResponseCodeConst,继承自基类,并将此类的code的起始值和末尾值注册进来

ResponseCodeContainer类中有两个map用于接受注册的code,用于检测。

# 4、启动检测

因为都是static常量,且类结构相同,所以可以在项目启动的时候利用static静态加载和反射技术进行全项目的code值检测。

即 调用ResponseCodeConst.init()方法


作者简介: 卓大 (opens new window), 1024创新实验室主任,混迹于各个技术圈,熟悉点java,略懂点前端。

加“卓大”微信,入群 关注 1024创新实验室! 我要请 1024创新实验室 喝胡辣汤~