2017-07-26 18 views
1

私はspringbootアプリケーションにキャッシュを追加しようとしていますが、起動時にorg.ehcache.jsr107.MultiCacheException例外がスローされる問題が発生しています。SpringbootとEhcache - MultiCacheException

私は(すべてはMavenのPOMファイルによってロードされた)次を使用しています:

@SpringBootApplication 
@EnableCaching 
public class DemoApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(DemoApplication.class, args); 
    } 
} 
: Springboot 1.5.5、Ehcacheの3.3.1、javaxのキャッシュは1.0.0

私SpringBootApplicationは、このようになります

@Component 
public class CacheConfig implements JCacheManagerCustomizer{ 
    @Override 
    public void customize(javax.cache.CacheManager cacheManager) { 
     cacheManager.createCache("item", new MutableConfiguration<>() 
       .setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(new Duration(TimeUnit.MINUTES, 5))) 
       .setStoreByValue(false) 
       .setStatisticsEnabled(true)); 
    } 
} 

そして、私のehcache.xmlファイルが含まれています:

私は、次のものが含まCacheConfigクラスを持っている

<config 
     xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' 
     xmlns='http://www.ehcache.org/v3' 
     xmlns:jsr107='http://www.ehcache.org/v3/jsr107'> 

    <service> 
     <jsr107:defaults> 
      <jsr107:cache name="item" template="heap-cache"/> 
     </jsr107:defaults> 
    </service> 

    <cache-template name="heap-cache"> 
     <listeners> 
      <listener> 
       <class>org.terracotta.ehcache.EventLogger</class> 
       <event-firing-mode>ASYNCHRONOUS</event-firing-mode> 
       <event-ordering-mode>UNORDERED</event-ordering-mode> 
       <events-to-fire-on>CREATED</events-to-fire-on> 
       <events-to-fire-on>UPDATED</events-to-fire-on> 
       <events-to-fire-on>EXPIRED</events-to-fire-on> 
       <events-to-fire-on>REMOVED</events-to-fire-on> 
       <events-to-fire-on>EVICTED</events-to-fire-on> 
      </listener> 
     </listeners> 
     <resources> 
      <heap unit="entries">2000</heap> 
      <offheap unit="MB">100</offheap> 
     </resources> 
    </cache-template> 
</config> 

テスト項目サービスが含まれています

@Service 
public class ItemService { 

    @CacheResult(cacheName = "item") 
    public String getItem(int itemNumber) { 
     switch (itemNumber) { 
      case 1: 
       return "Item 1"; 
      case 2: 
       return "Item 2"; 
      default: 
       return "No Item"; 

     } 
    } 
} 

そして最後に、application.propertiesが含まれています

:私は、アプリケーションを実行すると

spring.cache.jcache.config=classpath:ehcache.xml 

を、私はで終わる次の例外を取得します

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jCacheCacheManager' defined in class path resource [org/springframework/boot/autoconfigure/cache/JCacheCacheConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.cache.CacheManager]: Factory method 'jCacheCacheManager' threw exception; nested exception is org.ehcache.jsr107.MultiCacheException: [Exception 0] org.terracotta.ehcache.EventLogger 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1173) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1067) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    ... 70 common frames omitted 
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.cache.CacheManager]: Factory method 'jCacheCacheManager' threw exception; nested exception is org.ehcache.jsr107.MultiCacheException: [Exception 0] org.terracotta.ehcache.EventLogger 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    ... 83 common frames omitted 
Caused by: org.ehcache.jsr107.MultiCacheException: [Exception 0] org.terracotta.ehcache.EventLogger 
    at org.ehcache.jsr107.ConfigurationMerger.mergeConfigurations(ConfigurationMerger.java:138) ~[ehcache-3.3.1.jar:3.3.1 01f4b2121ef38b7e7d95c952c773881d5b1051d8] 
    at org.ehcache.jsr107.Eh107CacheManager.createCache(Eh107CacheManager.java:190) ~[ehcache-3.3.1.jar:3.3.1 01f4b2121ef38b7e7d95c952c773881d5b1051d8] 
    at com.example.cacheexample.CacheConfig.customize(CacheConfig.java:18) ~[classes/:na] 
    at org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration.customize(JCacheCacheConfiguration.java:149) ~[spring-boot-autoconfigure-1.5.5.RELEASE.jar:1.5.5.RELEASE] 
    at org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration.jCacheCacheManager(JCacheCacheConfiguration.java:104) ~[spring-boot-autoconfigure-1.5.5.RELEASE.jar:1.5.5.RELEASE] 
    at org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration$$EnhancerBySpringCGLIB$$e218d7d3.CGLIB$jCacheCacheManager$1(<generated>) ~[spring-boot-autoconfigure-1.5.5.RELEASE.jar:1.5.5.RELEASE] 
    at org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration$$EnhancerBySpringCGLIB$$e218d7d3$$FastClassBySpringCGLIB$$b2f1636b.invoke(<generated>) ~[spring-boot-autoconfigure-1.5.5.RELEASE.jar:1.5.5.RELEASE] 
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) ~[spring-core-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:358) ~[spring-context-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration$$EnhancerBySpringCGLIB$$e218d7d3.jCacheCacheManager(<generated>) ~[spring-boot-autoconfigure-1.5.5.RELEASE.jar:1.5.5.RELEASE] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121] 
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121] 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ~[spring-beans-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    ... 84 common frames omitted 

私はこのサイトで見つかったものをかなり複製しました: http://www.ehcache.org/blog/2016/05/18/ehcache3_jsr107_spring.html

洞察力は非常に高く評価されます。

ありがとうございました。

+0

'@ CacheResult'で注釈を付けたサービスはどのように見えますか?質問に追加してください。 –

+0

さて、テストサービスの外観を追加しました。 – Brad

+0

ソースを見てください - https://github.com/ehcache/ehcache3/blob/master/107/src/main/java/org/のcreateCacheメソッドで何が起きているのかを把握するためにブレークポイントを設定してみてくださいehcache/jsr107/Eh107CacheManager.java –

答えて

2

ehcache.xmlファイルで定義されているorg.terracotta.ehcache.EventLoggerクラスは、上のブログ記事で定義されているテストプログラムの目的のための単なるロガーでした。パッケージ名は、それがehcache配布の一部であると信じさせてくれました。

コードをステップ実行すると、NoClassDefFoundError例外が生成され、MultiCacheExceptionがスローされていました。スタックトラックの中には、NoClassDefFoundErrorが本当の原因であることが明らかにされていませんでした。私は自分のEventLoggerを作成しましたが、今はすべてが期待どおりに機能しています。

ポインタありがとうございます!