xuqiang 5 месяцев назад
Родитель
Сommit
db6e636063

+ 61 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/BeanCopyUtil.java

@@ -0,0 +1,61 @@
+package com.jzg.quotation.commons.utils;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ *  深拷贝工具类
+ * 1. 支持 Java8 日期类型 LocalDate/LocalDateTime
+ * 2. 忽略实体类不存在的字段,不报错
+ * 3. 嵌套对象/List/Map 完全深拷贝
+ */
+public final class BeanCopyUtil {
+
+    private static final ObjectMapper OBJECT_MAPPER;
+
+    static {
+        OBJECT_MAPPER = new ObjectMapper();
+
+        // 注册 Java8 日期时间模块(解决日期报错)
+        JavaTimeModule javaTimeModule = new JavaTimeModule();
+        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(dateFormatter));
+        javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(dateFormatter));
+        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter));
+        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeFormatter));
+        OBJECT_MAPPER.registerModule(javaTimeModule);
+        OBJECT_MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+    }
+
+    // 私有构造,禁止实例化
+    private BeanCopyUtil() {}
+
+    /**
+     * 深拷贝对象
+     * @param source 源对象
+     * @param clazz 目标对象类型
+     * @return 深拷贝后的新对象
+     */
+    public static <T> T deepCopy(Object source, Class<T> clazz) {
+        if (source == null) {
+            return null;
+        }
+        try {
+            String json = OBJECT_MAPPER.writeValueAsString(source);
+            return OBJECT_MAPPER.readValue(json, clazz);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("对象深拷贝失败", e);
+        }
+    }
+}