com.houkunlin.system.dict.starter.json.DictTextJsonSerializerEnums Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of system-dict-starter Show documentation
Show all versions of system-dict-starter Show documentation
系统数据字典自动翻译成字典文本。可集合系统数据库中存储的用户数据字典,也可使用枚举做系统数据字典,主要用在返回数据给前端时自动把字典值翻译成字典文本信息;
The system data dictionary is automatically translated into dictionary text.
The user data dictionary stored in the system database can be aggregated, and the enumeration can also be used as the system data dictionary.
It is mainly used to automatically translate dictionary values into dictionary text information when returning data to the front end.
The newest version!
package com.houkunlin.system.dict.starter.json;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import com.houkunlin.system.dict.starter.DictEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.lang.Nullable;
import java.io.IOException;
import java.io.Serializable;
/**
* 字段是枚举的情况,或者注解使用了枚举的情况
*
* @author HouKunLin
* @since 1.4.3
*/
public class DictTextJsonSerializerEnums extends DictTextJsonSerializerDefault {
protected static final Logger logger = LoggerFactory.getLogger(DictTextJsonSerializerEnums.class);
/**
* 缓存了直接使用系统字典枚举来渲染数据字典文本的所有数据
*/
private static final Table>, Serializable, String> CACHE_ENUMS = HashBasedTable.create();
/**
* 直接使用系统字典枚举的枚举对象列表
*/
protected final Class extends DictEnum>>[] enumsClass;
/**
* {@link #beanFieldClass} 是否是一个枚举类型
*/
protected final boolean isDictEnum;
/**
* 字段是特定枚举对象类型的场景
*
* @param beanClass 实体类 class
* @param beanFieldName 实体类字段名称
* @param dictText 实体类字段上的 {@link DictText} 注解对象
* @param enumsClass 实体类字段是一个特定枚举对象
*/
public DictTextJsonSerializerEnums(Class> beanClass, Class> beanFieldClass, String beanFieldName, DictText dictText, Class extends DictEnum>>[] enumsClass) {
super(beanClass, beanFieldClass, beanFieldName, dictText);
this.enumsClass = enumsClass;
this.isDictEnum = DictEnum.class.isAssignableFrom(beanFieldClass);
if (this.enumsClass.length == 0) {
logger.error("无法解析 {}#{} 字段的字典信息。请在该对象上使用 @DictText 注解标记", beanClass, beanFieldName);
}
initEnumsClass();
}
/**
* 初始化枚举对象数据,主要初始化枚举对象的字典值信息存储到Map对象中
*/
private void initEnumsClass() {
// 解析系统字典枚举列表
for (final Class extends DictEnum>> enumClass : enumsClass) {
if (!enumClass.isEnum()) {
continue;
}
final DictEnum>[] enumConstants = enumClass.getEnumConstants();
// 解析枚举对象枚举列表
for (DictEnum> enums : enumConstants) {
// 缓存系统字典枚举对象的解析数据
CACHE_ENUMS.put(enumClass, String.valueOf(enums.getValue()), enums.getTitle());
}
}
}
@Override
public void serialize(@Nullable final Object fieldValue, final JsonGenerator gen, final SerializerProvider serializers) throws IOException {
if (fieldValue == null) {
writeFieldValue(gen, null, defaultNullableValue(defaultDictTextResult));
return;
}
final Object outFieldValue;
final Object dictValueText;
if (isDictEnum) {
// 字段是系统字典枚举对象
final DictEnum> enums = (DictEnum>) fieldValue;
outFieldValue = enums.getValue();
dictValueText = enums.getTitle();
} else {
// 字段是普通类型,但是使用注解标记了来自枚举对象取值
outFieldValue = fieldValue;
dictValueText = obtainDictValueText(gen.getCurrentValue(), outFieldValue);
}
writeFieldValue(gen, outFieldValue, defaultNullableValue(dictValueText));
}
@Override
public Object serialize(final Object bean, final Object fieldValue) {
if (fieldValue == null) {
return defaultNullableValue(defaultDictTextResult);
}
final Object dictValueText;
if (isDictEnum) {
// 字段是系统字典枚举对象
final DictEnum> enums = (DictEnum>) fieldValue;
dictValueText = enums.getTitle();
} else {
// 字段是普通类型,但是使用注解标记了来自枚举对象取值
dictValueText = obtainDictValueText(bean, fieldValue);
}
return defaultNullableValue(dictValueText);
}
@Override
public String obtainDictValueText(final Object bean, final String dictValue) {
String cacheTitle;
for (final Class extends DictEnum>> aClass : enumsClass) {
cacheTitle = CACHE_ENUMS.get(aClass, String.valueOf(dictValue));
if (cacheTitle != null) {
return cacheTitle;
}
}
return null;
}
}