Parcourir la source

支持通配符扫描任意多个包(无需配置多个包路径),以及防止出现类名重复异常

RuoYi il y a 5 ans
Parent
commit
d5d2ae1da8

+ 1 - 1
ruoyi-admin/src/main/resources/application.yml

@@ -73,7 +73,7 @@ spring:
 # MyBatis
 mybatis:
     # 搜索指定包别名
-    typeAliasesPackage: com.ruoyi
+    typeAliasesPackage: com.ruoyi.**.domain
     # 配置mapper的扫描,找到所有的mapper.xml映射文件
     mapperLocations: classpath*:mapper/**/*Mapper.xml
     # 加载全局的配置文件

+ 1 - 1
ruoyi-framework/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java

@@ -13,7 +13,7 @@ import org.springframework.context.annotation.EnableAspectJAutoProxy;
 // 表示通过aop框架暴露该代理对象,AopContext能够访问
 @EnableAspectJAutoProxy(exposeProxy = true)
 // 指定要扫描的Mapper类的包的路径
-@MapperScan("com.ruoyi.*.mapper")
+@MapperScan("com.ruoyi.**.mapper")
 public class ApplicationConfig
 {
 

+ 95 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java

@@ -0,0 +1,95 @@
+package com.ruoyi.framework.config;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import javax.sql.DataSource;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.ResourcePatternResolver;
+import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
+import org.springframework.core.type.classreading.MetadataReader;
+import org.springframework.core.type.classreading.MetadataReaderFactory;
+import org.springframework.util.ClassUtils;
+
+/**
+ * Mybatis支持*匹配扫描包
+ * 
+ * @author ruoyi
+ */
+@Configuration
+public class MyBatisConfig
+{
+    @Autowired
+    private Environment env;
+
+    static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
+
+    public static String setTypeAliasesPackage(String typeAliasesPackage)
+    {
+        ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();
+        MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
+        typeAliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(typeAliasesPackage) + "/" + DEFAULT_RESOURCE_PATTERN;
+        try
+        {
+            List<String> result = new ArrayList<String>();
+            Resource[] resources = resolver.getResources(typeAliasesPackage);
+            if (resources != null && resources.length > 0)
+            {
+                MetadataReader metadataReader = null;
+                for (Resource resource : resources)
+                {
+                    if (resource.isReadable())
+                    {
+                        metadataReader = metadataReaderFactory.getMetadataReader(resource);
+                        try
+                        {
+                            result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());
+                        }
+                        catch (ClassNotFoundException e)
+                        {
+                            e.printStackTrace();
+                        }
+                    }
+                }
+            }
+            if (result.size() > 0)
+            {
+                HashSet<String> h = new HashSet<String>(result);
+                result.clear();
+                result.addAll(h);
+                typeAliasesPackage = String.join(",", (String[]) result.toArray(new String[0]));
+            }
+            else
+            {
+                throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包");
+            }
+        }
+        catch (IOException e)
+        {
+            e.printStackTrace();
+        }
+        return typeAliasesPackage;
+    }
+
+    @Bean
+    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
+    {
+        String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
+        String mapperLocations = env.getProperty("mybatis.mapperLocations");
+        typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
+
+        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
+        sessionFactory.setDataSource(dataSource);
+        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
+        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));
+        return sessionFactory.getObject();
+    }
+}