springboot在整合的时候遇见的一些坑

1、Multiple Spring Data modules found, entering strict repository configuration mode!

错误:

2019-05-28 15:28:32.439 INFO  main [org.springframework.data.repository.config.RepositoryConfigurationDelegate:165]-Multiple Spring Data modules found, entering strict repository configuration mode!
2019-05-28 15:28:32.596 INFO  main [org.springframework.data.repository.config.RepositoryConfigurationDelegate:165]-Multiple Spring Data modules found, entering strict repository configuration mode!

今天在整合redis的时候出现这个问题的原因:

分析

  • 根据控制台报文可以看到,日志是从RepositoryConfigurationDelegate类中打印出来的,而根据类路径名称大概知道类是归属spring-data相关包,用IDEA很容易定位到该类是在spring-data-commons包中。

spring-data-commons包并未有依赖冲突。那只好看RepositoryConfigurationDelegate具体实现了。 

  • 我们看一下RepositoryConfigurationDelegate这个类的实现

RepositoryConfigurationDelegate的实现:

	private static final String MULTIPLE_MODULES = "Multiple Spring Data modules found, entering strict repository configuration mode!";	
/**
	 * Scans {@code repository.support} packages for implementations of {@link RepositoryFactorySupport}. Finding more
	 * than a single type is considered a multi-store configuration scenario which will trigger stricter repository
	 * scanning.
	 *
	 * @return
	 */
	private boolean multipleStoresDetected() {

		boolean multipleModulesFound = SpringFactoriesLoader
				.loadFactoryNames(RepositoryFactorySupport.class, resourceLoader.getClassLoader()).size() > 1;

		if (multipleModulesFound) {
            // multipleModulesFound当为true就打印MULTIPLE_MODULES信息,
			LOG.info(MULTIPLE_MODULES);
		}

		return multipleModulesFound;
	}

我们通过代码找到了,问题出现在了:

SpringFactoriesLoader.loadFactoryNames(RepositoryFactorySupport.class, resourceLoader.getClassLoader()).size() > 1

这个查询结果不是1,就打印了:

    public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
        String factoryTypeName = factoryType.getName();
        return (List)loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
    }
private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
        MultiValueMap<String, String> result = (MultiValueMap)cache.get(classLoader);
        if (result != null) {
            return result;
        } else {
            try {
                Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
                LinkedMultiValueMap result = new LinkedMultiValueMap();

                while(urls.hasMoreElements()) {
                    URL url = (URL)urls.nextElement();
                    UrlResource resource = new UrlResource(url);
                    Properties properties = PropertiesLoaderUtils.loadProperties(resource);
                    Iterator var6 = properties.entrySet().iterator();

                    while(var6.hasNext()) {
                        Entry<?, ?> entry = (Entry)var6.next();
                        String factoryTypeName = ((String)entry.getKey()).trim();
                        String[] var9 = StringUtils.commaDelimitedListToStringArray((String)entry.getValue());
                        int var10 = var9.length;

                        for(int var11 = 0; var11 < var10; ++var11) {
                            String factoryImplementationName = var9[var11];
                            result.add(factoryTypeName, factoryImplementationName.trim());
                        }
                    }
                }

                cache.put(classLoader, result);
                return result;
            } catch (IOException var13) {
                throw new IllegalArgumentException("Unable to load factories from location [META-INF/spring.factories]", var13);
            }
        }
    }

从这个可以看出只要是实现了RepositoryFactorySupport 类的都会加载出来,而org.springframework.data.redis.repository.support.RedisRepositoryFactory正好实现了这个类,所以上面的就不止一个就出现了那个问题。

解决的方案有两种:

  • 第一种方案:@SpringBootApplication(exclude = { RedisRepositoriesAutoConfiguration.class })
  • 第二种方案:在配置文件里面配置--spring.data.redis.repositories.enabled=false

此处列举的是redis和mongo,其他jpa、es等配置都是类似的。关闭了Repository功能后,控制就不会在打印出Multiple Spring Data modules found, entering strict repository configuration mode!的提示信息了。

如果项目中使用了Repository功能,那建议启动类中指定Repository具体包扫描路径,如下:


@EnableRedisRepositories(basePackages = "xxx.redis.dao")

参考:https://blog.youkuaiyun.com/weixin_34010949/article/details/92021114 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值