首页 > JAVA端的错误码和错误信息,该设计成全局常量还是枚举值?

JAVA端的错误码和错误信息,该设计成全局常量还是枚举值?

Map<String,String> responseInfo = new HashTable<String,String>();
responseInfo.set("FE_PRC_BACK_001","TargetUri is not exist");
//responseInfo.set("FE_XREQ_002","Target Uri of XRequest is Empty.");
//responseInfo.set("FE_REQ_003","The processor flag is incorrect or the BusinessContext time out.");

FE_PRC_BACK_001这样的是错误码,TargetUri is not exist是错误信息,需要以键值对(JSON)的形式响应给浏览器
这时,JAVA端是应该以什么方式来罗列这些错误码和错误信息呢?常量?还是枚举类型?

String FE_PRC_BACK_001 = "TargetUri is not exist";

请教一下各位大神,你们的项目中都是怎么设计的?


把错误的key放在java的枚举里面,然后把错误的key和错误的信息的映射放在外部文件中,比如properties文件里。在运行时,根据错误枚举的key来实时从文件中取出错误文本就可以了,因为错误不是经常发生的,实时读取错误信息应该没有问题,当然你也可以在程序启动时候把所有的错误信息读进来然后放到缓存里以提高性能。


如果所有错误消息都已经确定了,可以写在程序里,用枚举比用全局常量更容易。全局常量要对应错误码和消息还是比较痛苦。

我最喜欢 Java 的枚举,主要就是因为 Java 的枚举类型可以扩展,可以有构造,可以重写 toString …… 因为 Java 的枚举本身就是一个对象,枚举类型本身就是一个比较特殊的类。

如果你的错误消息不能固定,可能在应用过程中添加,保存在数据库中。那就需要专门写一套管理类来处理,用 HashTable 或者 HashMap 之类的方式来实现。不过估计你的问题搞不到这么复杂。


有以下2种解决方案:
1、封装成一个对象,例如:

public final class Result {
    private Result(String code, String msg){
        this.code = code;
        this.msg = msg;
    }
    
    // ignore setter and getter
    private String code;
    private String msg;
    
    public static final FE_PRC_BACK_001 = new Result("FE_PRC_BACK_001", "TargetUri is not exist");
    
    public static final ...
}

2、用枚举实现,如下:

public enum Result {
    FE_PRC_BACK_001("FE_PRC_BACK_001", "TargetUri is not exist"), 
    ...;

    // ignore setter and getter and constructor
    private String code;
    private String msg;
}

1和2的实现思路其实是差不多的(跟题主给出的代码思路也是差不多的,差别只是使用具体的DTO还是通用的Map),但使用枚举的时候有以下几个地方要注意:
假设枚举Result存在于base-api中,版本1.0.0,分别有A、B项目,A项目依赖B项目,A、B项目均依赖base-api
1、如果B项目升级base-api至1.0.1,且Result新增了一个枚举量,并且B项目某接口返回了这个新增的枚举量,而A项目在没有升级base-api的情况下,如果调用到该接口并返回了新增的枚举量,则会报反序列化异常,因为新增的枚举量在旧版本的base-api里并不存在;
2、JSON序列化的时候,默认是把枚举序列化成枚举变量名称,如果想序列化成自定义的格式(例如包含msg),则需要自定义一个序列化器。

【热门文章】
【热门文章】