5

我正在尝试将 EhCache 配置为在启用了 Apache Shiro 的 Web 服务中处理授权缓存。目前我收到以下异常:

org.apache.shiro.cache.CacheException: net.sf.ehcache.CacheException: 另一个未命名的 CacheManager 已经存在于同一个 VM 中。请为配置中的每个 CacheManager 提供唯一名称或执行以下操作之一:

  1. 使用 CacheManager.create() 静态工厂方法之一来重用具有相同名称的相同 CacheManager 或在必要时创建一个
  2. 在创建具有相同名称的新缓存管理器之前关闭早期的缓存管理器。

我的 shiro.ini 看起来像:

[main]   
...    
cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager 
cacheManager.cacheManagerConfigFile = classpath:ehcache.xml  
securityManager.cacheManager = $cacheManager 

从这个 StackOverflow 帖子看来,使用 Spring 的人已经通过强制 CacheManager 成为单例解决了这个问题:另一个未命名的 CacheManager 已经存在于同一个 VM (ehCache 2.5)中。

是否有人知道不使用 Spring 初始化的变通办法(我在 dropwizard 框架中工作并且不需要引入 Spring)?是否有某种方式从 shiro.ini 强制执行单例配置?

先感谢您!

4

1 回答 1

3

创建一个扩展 EhCacheManager 的自定义类,并在构造函数中设置你的 cacheManager。这 (net.sf.ehcache.CacheManager.create()) 允许您重用已经存在的缓存管理器。

package lekkie.omotayo

public class MyShiroCacheManager extends EhCacheManager
{

    public CacheManager()
    {
        setCacheManager(net.sf.ehcache.CacheManager.create());
    }
}

然后你可以这样做:

cacheManager = lekkie.omotayo.MyShiroCacheManager
cacheManager.cacheManagerConfigFile = classpath:ehcache.xml
securityManager.cacheManager = $cacheManager
于 2013-02-07T14:05:29.347 回答