cn.bootx.platform.common.translate.service.FieldTranslationService Maven / Gradle / Ivy
The newest version!
package cn.bootx.platform.common.translate.service;
import cn.bootx.platform.common.core.annotation.Translate;
import cn.bootx.platform.common.core.annotation.TranslationResult;
import cn.bootx.platform.common.core.function.CollectorsFunction;
import cn.bootx.platform.common.translate.cache.TranslationCacheLocal;
import cn.bootx.platform.common.translate.cache.TranslationCacheLocal.Cache;
import cn.bootx.platform.common.translate.cache.TranslationCacheService;
import cn.bootx.platform.common.translate.domain.ConvertInfo;
import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ClassUtil;
import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collector;
import java.util.stream.Collectors;
/**
* 翻译服务
*
* @author xxm
* @since 2023/1/29
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class FieldTranslationService {
private final TranslationCacheService translationCacheService;
/**
* 字典值字段翻译转换
*/
public void translation(Collection> objects) {
translationCacheService.initCache(objects);
objects.forEach(this::translation0);
}
public void translation(Object object) {
translationCacheService.initCache(object);
this.translation0(object);
}
/**
* 字典值字段翻译转换
*/
private void translation0(Object object) {
if (Objects.isNull(object)) {
return;
}
// 遍历字段, 判断是否有嵌套对象
List list = Arrays.stream(BeanUtil.getPropertyDescriptors(object.getClass()))
.map(this::initConvertInfo)
.collect(Collectors.toList());
// 加注解的嵌套对象进行递归处理
List translationResults = list.stream()
.filter(o -> Objects.nonNull(o.getTranslationResult()))
.collect(Collectors.toList());
for (ConvertInfo translationResult : translationResults) {
Object fieldValue = BeanUtil.getFieldValue(object, translationResult.getName());
if (Objects.nonNull(fieldValue)) {
// 是否是集合
if (fieldValue instanceof Collection) {
((Collection>) fieldValue).forEach(this::translation0);
}
this.translation0(fieldValue);
}
}
// 筛选出带翻译注解的进行字段翻译
list.stream()
.filter(o -> Objects.nonNull(o.getTranslate()))
.peek(convertInfo -> isAndGetFieldType(convertInfo, object))
.forEach(o -> this.translation0(o, object));
}
/**
* 翻译前和翻译后的类型是否一致
*/
private Class> isAndGetFieldType(ConvertInfo convertInfo, Object convertObject) {
Translate translate = convertInfo.getTranslate();
// 直接在当前字段上进行转换才进行处理
if (StrUtil.isAllBlank(translate.source(), translate.target())) {
Object fieldValue = BeanUtil.getFieldValue(convertObject, convertInfo.getName());
if (!Objects.isNull(fieldValue)) {
Object value = this.getTranslationValue(translate, fieldValue);
if (Objects.nonNull(value)
&& !ClassUtil.isAssignable(convertInfo.getField().getType(), value.getClass())) {
return value.getClass();
}
}
}
return null;
}
/**
* 字典转换
* @param convertInfo 转换所需的元信息
* @param convertObject 要进行字典转换的对象
*/
private void translation0(ConvertInfo convertInfo, Object convertObject) {
Translate translate = convertInfo.getTranslate();
// 直接在当前字段上进行转换
if (StrUtil.isAllBlank(translate.source(), translate.target())) {
Object fieldValue = BeanUtil.getFieldValue(convertObject, convertInfo.getName());
if (!Objects.isNull(fieldValue)) {
Object dictValue = this.getTranslationValue(translate, fieldValue);
this.setFieldValue(convertObject, convertInfo.getName(), dictValue);
}
}
// 通过配置的源字段进行转换并赋值到当前字段
if (StrUtil.isNotBlank(translate.source())) {
Object fieldValue = BeanUtil.getFieldValue(convertObject, translate.source());
if (!Objects.isNull(fieldValue)) {
Object dictValue = this.getTranslationValue(translate, fieldValue);
this.setFieldValue(convertObject, convertInfo.getName(), dictValue);
}
}
// 将当前字段转换到其他字段上
if (StrUtil.isNotBlank(translate.target())) {
Object fieldValue = BeanUtil.getFieldValue(convertObject, convertInfo.getName());
if (!Objects.isNull(fieldValue)) {
Object dictValue = this.getTranslationValue(translate, fieldValue);
this.setFieldValue(convertObject, translate.target(), dictValue);
}
}
}
/**
* 初始化转换字段元信息
*/
private ConvertInfo initConvertInfo(PropertyDescriptor descriptor) {
Field field = ClassUtil.getDeclaredField(descriptor.getReadMethod().getDeclaringClass(), descriptor.getName());
Translate translate = AnnotationUtil.getAnnotation(field, Translate.class);
TranslationResult translationResult = AnnotationUtil.getAnnotation(field, TranslationResult.class);
return new ConvertInfo().setName(descriptor.getName())
.setField(field)
.setTranslate(translate)
.setTranslationResult(translationResult);
}
/**
* 转换成map
*/
public Collection