2011-11-18 35 views
3

我有一個非常基本的設置:Struts2 web-app,添加到它Ehcache-Web並試圖使其工作。Ehcache web CacheManager.replaceCacheWithDecoratedCache拋出NPE

這裏是我的ehcache.xml

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" 
     updateCheck="false" 
     dynamicConfig="false" 
     > 
    <diskStore path="java.io.tmpdir"/> 

    <defaultCache 
     maxElementsInMemory="100" 
     maxElementsOnDisk="1000" 
     eternal="false" 
     overflowToDisk="true" 
     diskPersistent="false" 
     memoryStoreEvictionPolicy="LRU" 
     timeToIdleSeconds="120000" 
     timeToLiveSeconds="120000" 
     /> 

    <cache name="searchDspCache" 
     maxElementsInMemory="100" 
     maxElementsOnDisk="1000" 
     eternal="false" 
     overflowToDisk="true" 
     diskPersistent="false" 
     memoryStoreEvictionPolicy="LRU" 
     timeToIdleSeconds="120000" 
     timeToLiveSeconds="120000"  
    /> 

</ehcache> 

下面是如何配置的Ehcache Web過濾器

<filter> 
     <filter-name>searchDspCachingFilter</filter-name> 
     <filter-class>net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter</filter-class> 
     <init-param> 
      <param-name>suppressStackTrace</param-name> 
      <param-value>false</param-value> 
     </init-param> 
     <init-param> 
      <param-name>cacheName</param-name> 
      <param-value>searchDspCache</param-value> 
     </init-param> 
    </filter> 

當應用程序部署在任一碼頭或Glassfish的,我得到這個錯誤正確前期:

20111118T115824,294 [sales-web] FATAL [Timer-1] (net.sf.ehcache.constructs.web.filter.Filter:201) - Could not initialise servlet filter. 
java.lang.NullPointerException 
    at net.sf.ehcache.CacheManager.replaceCacheWithDecoratedCache(CacheManager.java:950) 
    at net.sf.ehcache.constructs.web.filter.CachingFilter.doInit(CachingFilter.java:92) 

按照以下來自Ehcache網站的說明:

http://ehcache.org/documentation/modules/web-caching

手動下載從他們的回購正確eccache的Web和ehcache的核心來源:

net.sf.ehcache.constructs.web.filter.CachingFilter.doInit(CachingFilter.java:92)

https://oss.sonatype.org/content/groups/sourceforge/net/sf/ehcache/

,並檢查代碼的日誌中報告的行是:

/** 
* The cache name can be set through init parameters. If it is set it is 
* stored here. 
*/ <---- this is line 92 
protected String cacheName; 

at net.sf.ehcache.CacheManager.replaceCacheWithDecoratedCache(CacheManager.java:950)是:

// NPE guard 
if (cacheName == null || cacheName.length() == 0) { 
    return; 
} <-- this is line 950 

我知道我狠狠失去了一些東西,但我不知道是什麼。是否有人已經這樣做告訴我我做錯了什麼,或者我錯過了什麼。我只想做一些簡單的HTML內容緩存。 Thankx!

回答

2

好的,好吧,我已經解決了我個人的尷尬。下面是簡短的回答:

我的項目也使用Hibernate。 Hibernate帶有舊版本的Ehcache。在我的Maven安裝程序中發生的事情是Ehcache(版本1.2.3)的舊版本,Hibernate自帶的版本優先於我自己添加的版本(ehcache-web v 2.0.4 & ehcache-core 2.4。 6)。由於Ehcache的舊Hibernate版本不支持在SimplePageCachingFilter中命名緩存,所以出現錯誤。

長的答案:

爲了解決這個問題,我已經排除了Ehcache依賴從我的Hibernate依賴於項目的pom.xml像這樣:

<dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-annotations</artifactId> 
      <version>3.4.0.GA</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate</artifactId> 
      <version>3.2.7.ga</version> 
      <exclusions> 
      <exclusion> 
       <groupId>net.sf.ehcache</groupId> 
       <artifactId>ehcache</artifactId> 
      </exclusion> 
      </exclusions> 
     </dependency> 

我所做的探索這個問題是使用Maven依賴關係樹命令,像這樣:

C:\_andrei\me\myprojects2\dynamicFormGwtSpringWicket\springMvcApp>mvn dependency:tree -Dverbose -Dincludes=net.sf.ehcache 
(...) 
[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ springMcvApp --- 
[INFO] g1:springMcvApp:war:2.0 
[INFO] +- g1:modelApp:jar:2.0:compile 
[INFO] | \- org.hibernate:hibernate:jar:3.2.7.ga:compile 
[INFO] |  \- net.sf.ehcache:ehcache:jar:1.2.3:compile 
[INFO] \- net.sf.ehcache:ehcache-web:jar:2.0.4:compile 
[INFO] \- net.sf.ehcache:ehcache-core:jar:2.4.6:compile 

這說明我在TU的net.sf.ehcache:ehcache:jar:1.2.3依賴它來自休眠,這rn來自g1:modelApp:jar:2.0:compile具有優先權。加入exlude如下圖所示,重做的依賴關係樹命令後顯示我剛:

C:\_andrei\me\myprojects2\dynamicFormGwtSpringWicket\springMvcApp>mvn dependency:tree -Dverbose -Dincludes=net.sf.ehcache 
(...) 
INFO] g1:springMcvApp:war:2.0 
INFO] \- net.sf.ehcache:ehcache-web:jar:2.0.4:compile 
INFO] \- net.sf.ehcache:ehcache-core:jar:2.4.6:compile 

而事實上這種設置,因爲在我的問題描述我可以開始我的應用程序SimplePageCachingFilter配置,一切都開始OK,沒更多的例外。 Ehcache日誌還顯示過濾器實際上正在工作並正在執行任務。

我真的很感謝@jeha幫助我,讓我走向正確的方向。

2

} <-- this is line 950

我不認爲這是有問題的代碼行 - 你看合適的來源是什麼?從快看,CacheManager.replaceCacheWithDecoratedCache of Ehcache version 1.5,是一個更有前途:

if (!ehcache.equals(decoratedCache)) { // line 950 

這意味着,解釋NPE,即ehcachenull

名稱緩存SimplePageCachingFilterehcache.xml

<cache name="SimplePageCachingFilter" ... /> 

,它會工作。原因是SimplePageCachingFilter必須有一個名爲SimplePageCachingFilter的緩存!出於同樣的原因,您可以從web.xml中刪除init-param,cacheName

+0

我會試試這個,看起來很有希望,你在正確的軌道上使用正確的源代碼。關於緩存名稱我不知道......該文檔在他們自己的網站上清楚地表明,您的過濾器接受一個cacheName參數,並且您可以放入任何您想要的值,只要您確保您使用相同的值來命名您的ehcache.xml中的緩存...我會在星期日嘗試它並告訴您發生了什麼。感謝名單! –

+0

@AndreiBodnarescu:代碼清楚地表明'SimplePageCachingFilter.getCacheName()'總是返回'「SimplePageCachingFilter」'--) – jeha

+0

是的,先生,是的,你是對的。在我看來,爲了找到正確的代碼,我還沒有更多地解決這個問題。但另一方面,在他們的網站上:http://ehcache.org/documentation/modules/web-caching,如果你滾動到大約一半的文章,你會看到一個SimplePageCachingFilter的例子,它配置了一個名爲cache的「CachePage1CachingFilter」。 –