From 9b4433fddf5b401edb0aace8a404ac733b122702 Mon Sep 17 00:00:00 2001
From: 田源 <tianyuan@vci-tech.com>
Date: 星期四, 03 四月 2025 14:35:02 +0800
Subject: [PATCH] 添加非密字段显示
---
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.10.0