异常解决:Multiple CachingProviders have been configured when only a single CachingProvider is expected

springboot在引入hibernate之后,针对数据库操作,会配置二级缓存:

@Entity
@Table(name = "tt_xxxx_table")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class XxxxTableClazz implements Serializable {
.....

然而,缓存配置完成以后,有时候会遇到一些莫名其妙的异常:

Multiple CachingProviders have been configured when only a single CachingProvider is expected

 原因是由于本来只需要实例化一个bean的实例,却被初始化了多次,其报错原因如下:

public CachingProvider getCachingProvider(ClassLoader classLoader) {
    Iterator<CachingProvider> iterator = this.getCachingProviders(classLoader).iterator();
    if (iterator.hasNext()) {
        CachingProvider provider = (CachingProvider)iterator.next();
        if (iterator.hasNext()) {
            throw new CacheException("Multiple CachingProviders have been configured when only a single CachingProvider is expected");
        } else {
            return provider;
        }
    } else {
        throw new CacheException("No CachingProviders have been configured");
    }
}

由以上程序可知,错误原因便是iterator中存在多个实现了 CachingProvider的实例。

那么我们便可以查看一下程序中基于CachingProvider的实现类有哪些:

通过debugger调试可以知道:

确实有2个实例被加载进了iterator,从而会报出javax.cache.CacheException的错误。

此时检查项目pom.xml文件,发现项目在引入

<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
</dependency>

的同时还引入了

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
</dependency>

 而redisson的引入,由于java的spi机制,会再加载一次:

从而会导致有重复的CachingProvider出现。

那我们便有2个选择,保留redisson或者ehcache其中之一。

我选择的是注释掉redisson:

之后Reimport一下maven工程,便可以了

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值