2016-05-18 14 views
0

ehcache.xmlのSpring環境変数にアクセスしたいが、次のエラーが出る。ehcache.xmlのスプリング環境変数へのアクセス

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cacheManager' defined in class path resource [com/cache.xml]: Invocation of init method failed; nested exception is net.sf.ehcache.CacheException: Error configuring from input stream. Initial cause was null:166: Could not set attribute "maxElementsInMemory" - For input string: "${cache.report.maxMemoryElements}" 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) 
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:567) 
     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464) 
     at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385) 
     at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284) 
     at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111) 
     at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4994) 
     at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5492) 
     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
     at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) 
     at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) 
     at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:649) 
     at 

org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:672) 
     at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1861) 
     at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) 
     at java.util.concurrent.FutureTask.run(Unknown Source) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
     at java.lang.Thread.run(Unknown Source) 

私も、システムプロパティがehcache.xmlで利用可能であることを示すベローテストを実行します。何か案が?ありがとう。春のプロパティの抽象化は、システムプロパティは、プロパティファイルとシステム環境すなわち、複数のソースを使用しながら、

@Test 
    public void testLoadConfigurationWithReplacement() throws Exception { 
    System.setProperty("cache.report.maxMemoryElements", "4446"); 
    CacheManager manager = CacheManager.newInstance(TEST_CONFIG_DIR + "ehcache.xml"); 
    System.out.print("caches: " + manager.getCacheNames()); 
    assertEquals(manager.getCache("reportCache").getCacheConfiguration().getMaxEntriesLocalHeap(), 4446); 

    } 

答えて

1

Ehcacheのプロパティのプレースホルダは、システムプロパティから解決されています。

あなたが持っている最初のオプションを使用すると、アプリケーションすなわち-Dcache.report.maxMemoryElements = 4446

を実行したときに、これができない場合は、システムのプロパティを使用することで、あなたは本当にあなたができるファイル春のプロパティを使用する必要がありますSpringのプロパティファイルをシステムのプロパティにコピーするBeanFactoryPostProcessorを実装します。たとえば、次に

public class EhachePropertiesReplacer implements BeanFactoryPostProcessor , EnvironmentAware{ 

     private Environment environment; 

     private List<String> ehcachePropertyNames; 

     public void setEhcahePropertyNames(List<String> ehcachePropertyNames){ 
      this.ehcachePropertyNames = ehcachePropertyNames; 
     } 

     public void setEnvironment(Environment environment){ 
      this.environment = environment; 
     } 

     public void postProcessBeanFactory(ConfigurableBeanFactory bf){ 
      for(String ehcahePropertyName : ehcahePropetyNames){ 
      String ehcachePropertyValue = evironment.getProperty(ehcahePropertyName); 
      System.setProperty(ehcahePropertyName ,ehcachePropertyValue); 
      }  
     } 
    } 

} 

configファイル内

<bean class= "whatever.the.package.EhachePropertiesReplacer"> 
    <property name="ehachePropertyNames"> 
    <list> 
     <value>cache.report.maxMemoryElements</value> 
    </list> 
    </property> 
</bean> 
関連する問題