From 80b6cbfc9c861469146318d0b3dd5f8b8b525b8a Mon Sep 17 00:00:00 2001 From: xiejun <xiejun@vci-tech.com> Date: 星期五, 01 十一月 2024 15:11:19 +0800 Subject: [PATCH] Revert "集成获取mdm分发通用数据格式接口集成" --- Source/BladeX-Tool/blade-core-tool/src/main/java/org/springblade/core/tool/convert/BladeConverter.java | 77 ++++++++++++++++++++++++++++++++++++++ 1 files changed, 77 insertions(+), 0 deletions(-) diff --git a/Source/BladeX-Tool/blade-core-tool/src/main/java/org/springblade/core/tool/convert/BladeConverter.java b/Source/BladeX-Tool/blade-core-tool/src/main/java/org/springblade/core/tool/convert/BladeConverter.java new file mode 100644 index 0000000..08ba13f --- /dev/null +++ b/Source/BladeX-Tool/blade-core-tool/src/main/java/org/springblade/core/tool/convert/BladeConverter.java @@ -0,0 +1,77 @@ +package org.springblade.core.tool.convert; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.tool.function.CheckedFunction; +import org.springblade.core.tool.utils.ClassUtil; +import org.springblade.core.tool.utils.ConvertUtil; +import org.springblade.core.tool.utils.ReflectUtil; +import org.springblade.core.tool.utils.Unchecked; +import org.springframework.cglib.core.Converter; +import org.springframework.core.convert.TypeDescriptor; +import org.springframework.lang.Nullable; + +import java.lang.reflect.Field; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * 缁勫悎 spring cglib Converter 鍜� spring ConversionService + * + * @author L.cm + */ +@Slf4j +@AllArgsConstructor +public class BladeConverter implements Converter { + private static final ConcurrentMap<String, TypeDescriptor> TYPE_CACHE = new ConcurrentHashMap<>(); + private final Class<?> sourceClazz; + private final Class<?> targetClazz; + + /** + * cglib convert + * + * @param value 婧愬璞″睘鎬� + * @param target 鐩爣瀵硅薄灞炴�х被 + * @param fieldName 鐩爣鐨刦ield鍚嶏紝鍘熶负 set 鏂规硶鍚嶏紝BladeBeanCopier 閲屽仛浜嗘洿鏀� + * @return {Object} + */ + @Override + @Nullable + public Object convert(Object value, Class target, final Object fieldName) { + if (value == null) { + return null; + } + // 绫诲瀷涓�鏍凤紝涓嶉渶瑕佽浆鎹� + if (ClassUtil.isAssignableValue(target, value)) { + return value; + } + try { + TypeDescriptor targetDescriptor = BladeConverter.getTypeDescriptor(targetClazz, (String) fieldName); + // 1. 鍒ゆ柇 sourceClazz 涓� Map + if (Map.class.isAssignableFrom(sourceClazz)) { + return ConvertUtil.convert(value, targetDescriptor); + } else { + TypeDescriptor sourceDescriptor = BladeConverter.getTypeDescriptor(sourceClazz, (String) fieldName); + return ConvertUtil.convert(value, sourceDescriptor, targetDescriptor); + } + } catch (Throwable e) { + log.warn("BladeConverter error", e); + return null; + } + } + + private static TypeDescriptor getTypeDescriptor(final Class<?> clazz, final String fieldName) { + String srcCacheKey = clazz.getName() + fieldName; + // 蹇界暐鎶涘嚭寮傚父鐨勫嚱鏁帮紝瀹氫箟瀹屾暣娉涘瀷锛岄伩鍏嶇紪璇戦棶棰� + CheckedFunction<String, TypeDescriptor> uncheckedFunction = (key) -> { + // 杩欓噷 property 鐞嗚涓婁笉浼氫负 null + Field field = ReflectUtil.getField(clazz, fieldName); + if (field == null) { + throw new NoSuchFieldException(fieldName); + } + return new TypeDescriptor(field); + }; + return TYPE_CACHE.computeIfAbsent(srcCacheKey, Unchecked.function(uncheckedFunction)); + } +} -- Gitblit v1.9.3