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

查看:186
本文介绍了架构设计 - 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";

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

解决方案

有以下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),则需要自定义一个序列化器。

这篇关于架构设计 - JAVA端的错误码和错误信息,该设计成全局常量还是枚举值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆