背景
选用SpringCloud框架搭建微服务做业务后台应用时,会涉及到大量的业务状态值定义,一般常规做法是:
- 持久层(数据库)存储int类型的值
- 后台系统里用阅读性好一点儿的常量将int类型的值做一层映射
- 前端(app或浏览器)同样定义一套常量去映射这些关系
- 前端调用后台系统的接口时,使用常量定义的int类型进行提交
源于持久层存储的优化规则,int类型要比varchar类型效率高很多,这套做法也是大家接受度非常高的。
只是这里有一个不是很方便的地方:状态值映射的常量定义涉及前端和后台两部分,沟通的成本是一方面,另外如果状态值有变化,需要两组人员同时修改。
预期目标
在保证持久层的int类型存储状态值的前提下,主要是考虑业务状态的可阅读性问题和多处修改的问题,可阅读性问题一部分可以通过前后端人员定义常量来解决,但接口调试时还是直接使用int类型,这部分的可阅读性问题还是存在,多处修改的问题需要重点解决。
本篇推荐的方案:
- 持久层(数据库)存储没用原先的int类型值,这点保持不变
- 后台系统使用enum定义业务状态,不同的业务状态集可以由多个enum来实现,enum支持国际化
- 前端展示enum国际化的文本内容
- 前端调用后台系统接口时,使用enum国际化的文本内容进行提交
- 后台接收enum国际化的文本内容转换成int类型值,存储在数据库
方案的优点:
- 持久层原有的设计,效率性问题不受影响
- 业务状态的定义、映射全部内聚到后台系统,后续有状态值变化时,只需后台做相应修改即可
- 前端展示的内容,接口传输的内容均为阅读性更好的文本,并且支持国际化
方案的缺点:
- 后台系统存储、读取状态值时,需要用enum进行转换
- 通信传输的内容报文比原有的int类型大一点点
方案实践
实践原理
此实践方案主要包含三部分:
- Enum类使用Jackson进行JSON序列化和反序列化
- Enum枚举项的messages国际化处理
- Enum的定义
Enum自定义序列化和反序列化
先定义Enum国际化类,自定义Enum的序列化和反序列化类,并使用注解@JsonSerialize、@JsonDeserialize注册到Spring的ObjectMapper中
@JsonDeserialize(using = DescEnumDeserializer.class)
@JsonSerialize(using = DescEnumSerializer.class)
public interface I18NEnum {
/**
* 获取枚举描述
*
* @return
*/
String getDesc();
}
参考一下自定义的序列化实现:
/**
* @author huangying
*/
public class DescEnumSerializer extends JsonSerializer<I18NEnum> {
@Override
public void serialize(I18NEnum value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
// 按类名+枚举值名称拼接配置文件key,全部大写处理
String key = value.getClass().getSimpleName() + "." + StringUtils.upperCase(value.toString());
// I18NUtil为国际化处理工具类
String data = I18NUtil.get(key, value.<

本文介绍了如何在SpringCloud中实现enum枚举值的国际化处理,包括后台系统使用enum定义业务状态,enum的国际化处理工具类,以及enum的序列化和反序列化方法。方案优点在于提高业务状态的可阅读性和内聚性,缺点则在于增加了后台处理和通信传输的复杂性。
最低0.47元/天 解锁文章
70

被折叠的 条评论
为什么被折叠?



