SystemDictStarter v1.4.8,一种优雅的数据字典文本转换方式
在日常项目开发中,不免都会用到一些数据字典的信息,以及前端展示的时候通常也需要把这些数据字典值转换成具体字典文本信息。遇到这种场景通常都是后端把字典的文本转换好一起返回给前端,前端只需要直接展示即可。
一般情况下后端可能需要单独给返回对象创建一个字段来存储对应的字典文本值,然后进行手动的处理,这种方式通常比较繁琐,在字段多的时候会增加更多的工作量。
本项目基于 Jackson 的自定义注解功能实现了这一自动转换过程,不需要在对象中定义存放字典文本的字段,只需要在字段上使用 @DictText 注解,Jackson序列化的时候即可自动把字典值转换成字典文本。
本项目只适用使用 Jackson 做 JSON 序列化,在 fastjson 下失效
v1.4.8 版本已在 JDK8 JDK11 JDK17 环境下跑通所有单元测试样例
更新日志
- fix: 修复 JDK17 下运行失败问题
- feat: 重构使用字节码生成 Converter 转换器,增加 ASM 字节码支持
- feat: 增加配置支持切换字节码工具:ASM/JAVASSIST
- feat: 增加 DictText#dictTypeHandler 字典类型代码处理器支持,可以动态设置字段的字典类型代码
- feat: 支持自定义缓存键前缀
- feat: 增加树结构数据访问深度限制,防止陷入死循环
- feat: DictType 注解可重复使用,支持把多个枚举字典合并到一个字典中
- fix: 修复字段值为 null 时被序列化成 "null" 字符串的问题
项目地址
从数据库读取字典数据为注解提供数据支撑使用示例代码:system-dict-examples/examples-provider
刷新字典使用示例代码:system-dict-examples/examples-refresh-dict
树形结构数据转换使用示例代码:system-dict-examples/examples-tree-dict
简单使用文档
https://gitee.com/houkunlin/system-dict-starter/blob/main/usage.md
注解简单使用示例
// 注解的简单使用
@Data
@AllArgsConstructor
class Bean {
// {"userType":"1","userTypeText":"普通用户"}
@DictText("PeopleType")
private String userType = "1";
}
// 自定义字典文本输出字段
@Data
@AllArgsConstructor
class Bean {
// {"userType":"1","typeText":"普通用户"}
@DictText(value = "PeopleType", fieldName = "typeText")
private String userType = "1";
}
// 使用分隔符来存储多个字典值
@Data
@AllArgsConstructor
class Bean {
// {"userType":"0,1","userTypeText":"系统管理、普通用户"}
@DictText(value = "PeopleType", array = @Array(split = ","))
private String userType = "0,1";
}
// 使用集合来存储多个字典值
@Data
@AllArgsConstructor
class Bean {
// {"userType":["0","1"],"userTypeText":"系统管理、普通用户"}
@DictText("PeopleType")
private List<String> userType = Arrays.asList("0", "1");
}
// 把集合的字典文本转换成数组形式
@Data
@AllArgsConstructor
class Bean {
// {"userType":["0","1"],"userTypeText":["系统管理","普通用户"]}
@DictText(value = "PeopleType", array = @Array(toText = false))
private List<String> userType = Arrays.asList("0", "1");
}
// 转换成 Map 形式在原字段上输出
@Data
@AllArgsConstructor
class Bean {
// {"userType":{"text":"普通用户","value":"1"}}
@DictText(value = "PeopleType", mapValue = DictText.Type.YES, replace = DictText.Type.YES)
private String userType;
}