Caused by: net.sf.ehcache.CacheException: 同一VM 中已存在另一个同名“shiro-cache”的CacheManager。请为配置中的每个CacheManager 提供唯一的名称,或执行以下操作之一:1。使用CacheManager.create( ) 静态工厂方法之一来重用具有相同名称的同一个CacheManager,或者在必要时创建一个CacheManager2。在创建同名的新缓存管理器之前,请关闭早期的缓存管理器。出现这个错误的原因是,对于新版本(2.5及以上)的Ehcache,CacheManager采用单例模式,当使用Spring Boot devtools启用热重加载功能时,加载SecurityManager Bean对象实例时会创建多个CacheManager实例,导致出现上述异常。
在此之前,网上已经给出了很多解决方案,比如降低Ehcache版本、设置缓存共享属性等。那么,如何在不改变当前框架版本的情况下修复上述异常呢?下面是作者的完整解决方案。
1、改造前的代码
以下代码片段是转换前的示例:
本例中只是简单创建了ehcacheManager对象实例,并设置了缓存文件的存储地址。新版本中要求CacheManager为单例模式,因此需要使用EhCachManagerFactoryBean对象将cacheManager限制为共享模式。 EhCachManagerFactoryBean是Spring提供的ehcache实现类。接下来我们看看如何改造。
2.修改代码
共有三处修改。分别是:配置EhcacheManagerFactoryBean并设置为共享模式,配置DefaultAdvisorAutoProxyCreator,让Spring管理Shiro的bean生命周期,配置lifecycleBeanPostProcessor,让DefaultAdvisorAutoProxyCreator依赖于这个对象。
2.1 添加EhcacheManagerFactoryBean配置项
在原配置文件中添加EhcacheManagerFactoryBean配置项,并将shared属性设置为true。示例代码如下:
2.2 添加LifecycleBeanPostProcessor配置项
添加LifecycleBeanPostProcessor配置项。 LifecycleBeanPostProcessor会统一管理Initialized和Destroyable的实现类,从而达到统一管理Shiro Bean生命周期的目的。示例代码如下:
2.3 添加DefaultAdvisorAutoProxyCreator配置项
DefaultAdvisorAutoProxyCreator的作用是动态代理Shiro的事务,最终将事务交给Spring统一管理。该配置项需要依赖LifecycleBeanPostProcessor。示例代码如下:
本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/5660.html
用户评论
我遇到了这个错误提示,是在使用Spring Boot的时候吗?
有5位网友表示赞同!
换了不同的名字试试?
有10位网友表示赞同!
另一个CacheManager的名字重复了?那应该检查配置文件看有没有写错地方。
有20位网友表示赞同!
遇到过这种情况,可以尝试删除重复的配置项!
有20位网友表示赞同!
确保缓存管理器bean 的名称唯一。检查容器中的所有bean定义。
有17位网友表示赞同!
这可能是Spring配置的问题,需要检查spring的配置文件?
有17位网友表示赞同!
别忘了重启项目试试哦!有时候简单重启就能解决这个问题。
有10位网友表示赞同!
这个错误提示说明CacheManager定义冲突了,应该查看相应的配置文档!
有10位网友表示赞同!
重命名或者删除重复的CacheManager即可
有9位网友表示赞同!
检查你的配置文件或者代码里有没有同样的CacheManager的定义!
有9位网友表示赞同!
如果在项目中有多个spring应用的话还需要留意不同模块的配置冲突!
有14位网友表示赞同!
我之前遇到的时候是Spring Boot自动生成的配置导致冲突,修改配置文件就解决了!
有16位网友表示赞同!
可以看看Spring文档,解释了CacheManager的定义以及命名规则!
有15位网友表示赞同!
这个错误提示非常恼人啊,希望你能找到解决办法!
有12位网友表示赞同!
仔细检查你的代码,确保没有重复使用相同的CacheManager名称
有14位网友表示赞同!
遇到这种情况一般是配置文件冲突引起的,需要仔细排查!
有20位网友表示赞同!
这种错误通常出现在SpringBoot的集成测试中,建议看看Spring文档的解释。
有14位网友表示赞同!
有没有尝试更新一下相关依赖包试试?有时版本问题也会导致这个错误。
有18位网友表示赞同!