Bläddra i källkod

优化实体工厂,可设置默认关系映射和默认属性复制

zhouhao 7 år sedan
förälder
incheckning
836a7f135b

+ 12 - 0
hsweb-commons/hsweb-commons-entity/src/main/java/org/hswebframework/web/commons/entity/factory/DefaultMapperFactory.java

@@ -0,0 +1,12 @@
+package org.hswebframework.web.commons.entity.factory;
+
+import java.util.function.Function;
+
+/**
+ * 默认的实体映射
+ *
+ * @author zhouhao
+ */
+@FunctionalInterface
+public interface DefaultMapperFactory extends Function<Class, MapperEntityFactory.Mapper> {
+}

+ 10 - 0
hsweb-commons/hsweb-commons-entity/src/main/java/org/hswebframework/web/commons/entity/factory/DefaultPropertyCopier.java

@@ -0,0 +1,10 @@
+package org.hswebframework.web.commons.entity.factory;
+
+/**
+ * 默认的属性复制器
+ *
+ * @author zhouhao
+ */
+@FunctionalInterface
+public interface DefaultPropertyCopier extends PropertyCopier<Object, Object> {
+}

+ 50 - 12
hsweb-commons/hsweb-commons-entity/src/main/java/org/hswebframework/web/commons/entity/factory/MapperEntityFactory.java

@@ -39,6 +39,29 @@ public class MapperEntityFactory implements EntityFactory {
     private Logger                      logger         = LoggerFactory.getLogger(this.getClass());
     private Map<String, PropertyCopier> copierCache    = new HashMap<>();
 
+    private static final DefaultMapperFactory DEFAULT_MAPPER_FACTORY = clazz -> {
+        String simpleClassName = clazz.getPackage().getName().concat(".Simple").concat(clazz.getSimpleName());
+        try {
+            return defaultMapper(Class.forName(simpleClassName));
+        } catch (ClassNotFoundException ignore) {
+            // throw new NotFoundException(e.getMessage());
+        }
+        return null;
+    };
+
+    private static final DefaultPropertyCopier DEFAULT_PROPERTY_COPIER = (source, target) -> {
+        Object sourcePar = JSON.toJSON(source);
+        if (sourcePar instanceof JSONObject) {
+            return ((JSONObject) sourcePar).toJavaObject(target.getClass());
+        }
+        return JSON.parseObject(JSON.toJSONString(source), target.getClass());
+    };
+
+    private DefaultMapperFactory defaultMapperFactory = DEFAULT_MAPPER_FACTORY;
+
+    private DefaultPropertyCopier defaultPropertyCopier = DEFAULT_PROPERTY_COPIER;
+
+
     public MapperEntityFactory() {
     }
 
@@ -81,11 +104,13 @@ public class MapperEntityFactory implements EntityFactory {
             PropertyCopier<S, T> copier = copierCache.<S, T>get(getCopierCacheKey(source.getClass(), target.getClass()));
             if (null != copier) return copier.copyProperties(source, target);
 
-            Object sourcePar = JSON.toJSON(source);
-            if (sourcePar instanceof JSONObject) {
-                return ((JSONObject) sourcePar).toJavaObject((Class<T>) target.getClass());
-            }
-            return JSON.parseObject(JSON.toJSONString(source), (Class<T>) target.getClass());
+            return (T) defaultPropertyCopier.copyProperties(source, target);
+//
+//            Object sourcePar = JSON.toJSON(source);
+//            if (sourcePar instanceof JSONObject) {
+//                return ((JSONObject) sourcePar).toJavaObject((Class<T>) target.getClass());
+//            }
+//            return JSON.parseObject(JSON.toJSONString(source), (Class<T>) target.getClass());
         } catch (Exception e) {
             logger.warn("copy properties error", e);
         }
@@ -102,20 +127,24 @@ public class MapperEntityFactory implements EntityFactory {
         }
         //尝试使用 Simple类,如: package.SimpleUserBean
         if (realType == null) {
-            String simpleClassName = beanClass.getPackage().getName().concat(".Simple").concat(beanClass.getSimpleName());
-            try {
-                realType = (Class<T>) Class.forName(simpleClassName);
-            } catch (ClassNotFoundException e) {
-                // throw new NotFoundException(e.getMessage());
-            }
+            mapper = defaultMapperFactory.apply(beanClass);
+//
+//            String simpleClassName = beanClass.getPackage().getName().concat(".Simple").concat(beanClass.getSimpleName());
+//            try {
+//                realType = (Class<T>) Class.forName(simpleClassName);
+//            } catch (ClassNotFoundException e) {
+//                // throw new NotFoundException(e.getMessage());
+//            }
         }
         if (!Modifier.isInterface(beanClass.getModifiers()) && !Modifier.isAbstract(beanClass.getModifiers())) {
             realType = beanClass;
         }
-        if (realType != null) {
+        if (mapper == null && realType != null) {
             if (logger.isDebugEnabled())
                 logger.debug("use instance {} for {}", realType, beanClass);
             mapper = new Mapper<>(realType, new DefaultInstanceGetter(realType));
+        }
+        if (mapper != null) {
             realTypeMapper.put(beanClass, mapper);
         }
         return mapper;
@@ -151,6 +180,15 @@ public class MapperEntityFactory implements EntityFactory {
         return beanClass;
     }
 
+    public void setDefaultMapperFactory(DefaultMapperFactory defaultMapperFactory) {
+        Objects.requireNonNull(defaultMapperFactory);
+        this.defaultMapperFactory = defaultMapperFactory;
+    }
+
+    public void setDefaultPropertyCopier(DefaultPropertyCopier defaultPropertyCopier) {
+        this.defaultPropertyCopier = defaultPropertyCopier;
+    }
+
     public static class Mapper<T> {
         Class<T>    target;
         Supplier<T> instanceGetter;