Java Spring缓存不与EHCache+;JCache

Java Spring缓存不与EHCache+;JCache,java,spring,ehcache,spring-cache,jcache,Java,Spring,Ehcache,Spring Cache,Jcache,我正在尝试将jcache的ehcache实现集成到spring中。所以我有一个定义如下的外观: @Component(value = "sampleFacade") @CacheDefaults(cacheName = "default") public class SampleFacadeImpl implements SampleFacade { @Override @CacheResult(cacheName = "site") public SitePojo

我正在尝试将jcache的ehcache实现集成到spring中。所以我有一个定义如下的外观:

@Component(value = "sampleFacade")
 @CacheDefaults(cacheName = "default")
 public class SampleFacadeImpl implements SampleFacade
 {

   @Override
   @CacheResult(cacheName = "site")
    public SitePojo getSiteForUid(final String uid)
    {
        System.out.println("getting the site for uid: " + uid);

        final SitePojo pojo = new SitePojo();
        pojo.setUid(uid);
        pojo.setUrl(uid);

        return pojo;
    }
}
@Configuration
@EnableCaching(mode = AdviceMode.PROXY)
@ComponentScan(basePackages = { "com.test" })
public class TestConfig implements CachingConfigurer
{
   @Resource
   public ApplicationContext context;

   @Override
   @Bean(name = { "defaultKeyGenerator", "keyGenerator" })
   public KeyGenerator keyGenerator() {
       return new SimpleKeyGenerator();
   }

   @Override
   @Bean(name = { "defaultCacheManager", "cacheManager" })
   public CacheManager cacheManager() {
       final JCacheCacheManager cacheManager = new JCacheCacheManager();
       cacheManager.setCacheManager((javax.cache.CacheManager) context.getBean("cacheManagerFactoryBean"));

       return cacheManager;
   }

   @Bean(name = { "defaultCacheManagerFactoryBean", "cacheManagerFactoryBean" })
   protected JCacheManagerFactoryBean defaultCacheManagerFactoryBean() {
       return new JCacheManagerFactoryBean();
   }
}
基于java的配置如下所示:

@Component(value = "sampleFacade")
 @CacheDefaults(cacheName = "default")
 public class SampleFacadeImpl implements SampleFacade
 {

   @Override
   @CacheResult(cacheName = "site")
    public SitePojo getSiteForUid(final String uid)
    {
        System.out.println("getting the site for uid: " + uid);

        final SitePojo pojo = new SitePojo();
        pojo.setUid(uid);
        pojo.setUrl(uid);

        return pojo;
    }
}
@Configuration
@EnableCaching(mode = AdviceMode.PROXY)
@ComponentScan(basePackages = { "com.test" })
public class TestConfig implements CachingConfigurer
{
   @Resource
   public ApplicationContext context;

   @Override
   @Bean(name = { "defaultKeyGenerator", "keyGenerator" })
   public KeyGenerator keyGenerator() {
       return new SimpleKeyGenerator();
   }

   @Override
   @Bean(name = { "defaultCacheManager", "cacheManager" })
   public CacheManager cacheManager() {
       final JCacheCacheManager cacheManager = new JCacheCacheManager();
       cacheManager.setCacheManager((javax.cache.CacheManager) context.getBean("cacheManagerFactoryBean"));

       return cacheManager;
   }

   @Bean(name = { "defaultCacheManagerFactoryBean", "cacheManagerFactoryBean" })
   protected JCacheManagerFactoryBean defaultCacheManagerFactoryBean() {
       return new JCacheManagerFactoryBean();
   }
}
以及调用facade 10次的测试:

@Test
public void testGetSiteForUid() {
    for (int i = 0; i < 10; i++) {
        assertNotNull(sampleFacade.getSiteForUid("uid"));
    }
}
getting the site for uid: uid
getting the site for uid: uid
getting the site for uid: uid
getting the site for uid: uid
getting the site for uid: uid
getting the site for uid: uid
getting the site for uid: uid
getting the site for uid: uid
getting the site for uid: uid
getting the site for uid: uid
您可以在此处找到一个示例项目来复制它:
JCache支持是Spring 4.1的一项新功能。您使用的是4.0.4,它还没有这种支持

SpringFramework 4.1尚未发布。您可以通过将以下内容添加到项目中来尝试快照

<repositories>
  <repository>
    <id>spring-snapshot</id>
    <name>Springframework Snapshot Repository</name>
    <url>http://repo.spring.io/snapshot</url>
    <snapshots>
      <enabled>true</enabled>
    </snapshots>
  </repository>
</repositories>

春季快照
Springframework快照存储库
http://repo.spring.io/snapshot
真的
然后将
spring.version
翻转到
4.1.0.BUILD-SNAPSHOT

我已经对你的项目进行了分叉并进行了更新,使其能够正常工作。有助于你理解遗漏了什么


注意:您的JSR-107缓存管理器是错误的。您应该创建一个
javax.cache.CacheManager
,一旦有了它,就应该将它包装到Spring的
CacheManager
。请记住,您也可以在那里声明any
CacheManager
,它会工作(
SimpleCacheManager
GuavacheManager
,等等)。

您好,我尝试了您的建议,它显示了以下错误:java.lang.IllegalArgumentException:找不到CacheResultOperation的名为“site”的缓存[详细信息][method=public com.test.cache.SitePojo com.test.cache.impl.SampleFacadeImpl.getCurrentSite(),cacheAnnotation=@javax.cache.annotation.CacheResult(cacheKeyGenerator=interface javax.cache.annotation.cacheResolverFactory,cachedExceptions=[],skipGet=false,exceptionCacheName=,cacheName=site,nonCachedExceptions=[]),cacheName='site']]嗨,我尝试了你的建议,它显示了这个错误:嗨,我尝试了你的建议,它显示了这个错误:我在你的scratch应用程序中看到你像这样使用SimpleCacheManager:SimpleCacheManager manager=new SimpleCacheManager();manager.setCaches(asList(新ConcurrentMapCache(“默认”),新ConcurrentMapCache(“另一”));return manager;但不幸的是,JCacheCacheCacheManager没有setCaches方法。如何为我的JCacheCacheManager指定缓存?我认为您应该重新访问
ehcache jcache
以及如何配置它。创建另一个线程可能是个好主意,因为这与Spring无关(这是一个纯粹的JSR-107 ehcache问题)。与此同时,您可以直接使用纯ehcache或查看我的fork(我编辑了我的原始答案)