|
|
@@ -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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|