Przeglądaj źródła

新增通用枚举处理器完善

= 7 lat temu
rodzic
commit
cf81d3f928

+ 19 - 11
src/main/java/com/baomidou/mybatisplus/spring/MybatisSqlSessionFactoryBean.java

@@ -23,7 +23,9 @@ import static org.springframework.util.StringUtils.tokenizeToStringArray;
 
 import java.io.IOException;
 import java.sql.SQLException;
+import java.util.HashSet;
 import java.util.Properties;
+import java.util.Set;
 
 import javax.sql.DataSource;
 
@@ -59,6 +61,7 @@ import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
 import com.baomidou.mybatisplus.MybatisConfiguration;
 import com.baomidou.mybatisplus.MybatisXMLConfigBuilder;
 import com.baomidou.mybatisplus.entity.GlobalConfiguration;
+import com.baomidou.mybatisplus.enums.IEnum;
 import com.baomidou.mybatisplus.exceptions.MybatisPlusException;
 import com.baomidou.mybatisplus.mapper.SqlRunner;
 import com.baomidou.mybatisplus.toolkit.GlobalConfigUtils;
@@ -453,24 +456,29 @@ public class MybatisSqlSessionFactoryBean implements FactoryBean<SqlSessionFacto
             }
         }
 
-        // TODO 自定义枚举扫描处理
+        // TODO 自定义枚举扫描处理
         if (hasLength(this.typeEnumsPackage)) {
-            // 取得类型转换注册器
-            String[] typeEnumsPackageArray;
+            Set<Class> classes = null;
             if (typeEnumsPackage.contains("*") && !typeEnumsPackage.contains(",")
                     && !typeEnumsPackage.contains(";")) {
-                typeEnumsPackageArray = PackageHelper.convertTypeAliasesPackage(typeEnumsPackage);
+                classes = PackageHelper.scanTypePackage(typeEnumsPackage);
             } else {
-                typeEnumsPackageArray = tokenizeToStringArray(this.typeEnumsPackage,
+                String[] typeEnumsPackageArray = tokenizeToStringArray(this.typeEnumsPackage,
                         ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS);
+                if (typeEnumsPackageArray == null) {
+                    throw new MybatisPlusException("not find typeEnumsPackage:" + typeEnumsPackage);
+                }
+                classes = new HashSet<Class>();
+                for (String typePackage : typeEnumsPackageArray) {
+                    classes.addAll(PackageHelper.scanTypePackage(typePackage));
+                }
             }
-            if (typeEnumsPackageArray == null) {
-                throw new MybatisPlusException("not find typeEnumsPackage:" + typeEnumsPackage);
-            }
+            // 取得类型转换注册器
             TypeHandlerRegistry typeHandlerRegistry = this.configuration.getTypeHandlerRegistry();
-            for (String packageToScan : typeEnumsPackageArray) {
-                // 注册 TODO
-//                typeHandlerRegistry.register(className, "com.baomidou.mybatisplus.enums.IEnumTypeHandler");
+            for (Class cls : classes) {
+                if (cls.isEnum() && IEnum.class.isAssignableFrom(cls)) {
+                    typeHandlerRegistry.register(cls.getName(), "com.baomidou.mybatisplus.enums.IEnumTypeHandler");
+                }
             }
         }
 

+ 40 - 1
src/main/java/com/baomidou/mybatisplus/toolkit/PackageHelper.java

@@ -54,7 +54,7 @@ public class PackageHelper {
         MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
         String pkg = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
                 + ClassUtils.convertClassNameToResourcePath(typeAliasesPackage) + "/*.class";
-		/*
+        /*
          * 将加载多个绝对匹配的所有Resource
 		 * 将首先通过ClassLoader.getResource("META-INF")加载非模式路径部分,然后进行遍历模式匹配,排除重复包路径
 		 */
@@ -80,4 +80,43 @@ public class PackageHelper {
         }
     }
 
+
+    /**
+     * <p>
+     * 扫描获取指定包路径所有类
+     * </p>
+     *
+     * @param typePackage 扫描类包路径
+     * @return
+     */
+    public static Set<Class> scanTypePackage(String typePackage) {
+        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
+        MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
+        String pkg = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
+                + ClassUtils.convertClassNameToResourcePath(typePackage) + "/*.class";
+        /*
+         * 将加载多个绝对匹配的所有Resource
+		 * 将首先通过ClassLoader.getResource("META-INF")加载非模式路径部分,然后进行遍历模式匹配,排除重复包路径
+		 */
+        try {
+            Set<Class> set = new HashSet<>();
+            Resource[] resources = resolver.getResources(pkg);
+            if (resources != null && resources.length > 0) {
+                MetadataReader metadataReader;
+                for (Resource resource : resources) {
+                    if (resource.isReadable()) {
+                        metadataReader = metadataReaderFactory.getMetadataReader(resource);
+                        set.add(Class.forName(metadataReader.getClassMetadata().getClassName()));
+                    }
+                }
+            }
+            if (set.isEmpty()) {
+                throw new MybatisPlusException("not find scanTypePackage:" + pkg);
+            } else {
+                return set;
+            }
+        } catch (Exception e) {
+            throw new MybatisPlusException("not find scanTypePackage:" + pkg, e);
+        }
+    }
 }