- 一般前后台交互遇到需要转义的数据时,后端提供接口查询所有的数据字典项,然后前台获取后根据后台返回的值进行转义。
- 后端一般将数据字典存在数据库中,然后提供一个查询所有数据字典的接口。每次有新增数据字典时,需要打个脚本进行配置。
- 现在大多数项目开发时,后端均用枚举类替换数据字典常量,但是转义的工作还是需要建一个中英文的对照数据字典表给前台转义使用。
- 考虑可以采用反射获取枚举类,然后获取所有枚举的中英文对照关系,然后提供接口给前台使用,避免建表打脚本的工作。
- 引入反射工具包
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.12</version>
</dependency>
- 新增接口
public interface DictEnumSupporter {
String name();
String getDescription();
}
接口的目的是标识枚举是要被转义的,且要转义的枚举需要定义中文描述。
- 定义的枚举需要统一放在某个或某几个地方(反射的时候需要用的),且都要实现DictEnumSupporter接口
public enum YesOrNoEnum implements DictEnumSupporter {
YES( "是"),
NO("否");
private String description;
YesOrNoEnum( String description) {
this.description = description;
}
@Override
public String getDescription() {
return this.description;
}
}
- 实现枚举转义功能
@Component
public class DictFactory {
private static final Logger log = LoggerFactory.getLogger(DictFactory.class);
private static final Map<String, Map<String, String>> enumConstantCache = new HashMap<>();
private final Set<String> prefixPackages = new HashSet<>();
public DictFactory() {
prefixPackages.add("com.jianyu.common.emuns");
}
public void addPrefixPackages(String prefixPackage) {
prefixPackages.add(prefixPackage);
}
public Map<String, Map<String, String>> getEnumConstants() {
if (enumConstantCache.isEmpty()) {
for (String prefixPackage : prefixPackages) {
Reflections reflections = new Reflections(prefixPackage);
Set<Class<? extends DictEnumSupporter>> enumsClass = reflections.getSubTypesOf(DictEnumSupporter.class);
for (Class<?> aClass : enumsClass) {
if (!Enum.class.isAssignableFrom(aClass)) {
log.warn("only support Enum class, unexpected class : {}" , aClass.getName());
continue;
}
enumConstantCache.put(aClass.getSimpleName(), enumValuesToMap(aClass));
}
}
}
return enumConstantCache;
}
private Map<String, String> enumValuesToMap(Class<?> aClass) {
Map<String, String> map = new LinkedHashMap<>();
DictEnumSupporter[] enumConstants = (DictEnumSupporter[]) aClass.getEnumConstants();
for (DictEnumSupporter supporter : enumConstants) {
map.put(supporter.name(), supporter.getDescription());
}
return map;
}
public Set<String> getPrefixPackages() {
return prefixPackages;
}
}
如果枚举定义在多个包下,就添加多个。
- 提供获取所有枚举接口
@RequestMapping(value = "/getAllEnumConstants")
public Object getAllEnumConstants() {
return dictFactory.getEnumConstants();
}
返回的结果:{"code":200,"message":"成功","data":{"CreateMode":{"SYSTEM_CREATE":"系统创建","ARTIFICAL_CREATE":"人工创建"},"YesOrNoEnum":{"YES":"是","NO":"否"}}}
就实现了给前台的枚举转义。