Ehcache web CacheManager.replaceCacheWithDecoratedCache抛出NPE

时间:2011-11-18 11:04:54

标签: java configuration ehcache

我有一个非常基本的设置:Struts2 web-app,添加到它Ehcache-Web并尝试使其工作。

这是我的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网络过滤器的方法

<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>

当应用程序部署在Jetty或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-core来源:

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

并检查日志中报告的代码行:

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

/**
 * 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 个答案:

答案 0 :(得分:2)

  

} <-- this is line 950

我不认为这是有问题的代码行 - 您是否看过正确的来源?从快速看,CacheManager.replaceCacheWithDecoratedCache of Ehcache version 1.5,更有前途:

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

这意味着,解释NPE,ehcachenull

SimplePageCachingFilter

中为缓存ehcache.xml命名
<cache name="SimplePageCachingFilter" ... />

它会起作用。原因是SimplePageCachingFilter必须有一个名为SimplePageCachingFilter的缓存!出于同样的原因,您可以从init-param中忽略cacheName的{​​{1}}。

答案 1 :(得分:2)

好吧,我个人的尴尬已经解决了。这是简短的回答:

我的项目也使用Hibernate。 Hibernate附带了旧版本的Ehcache。在我的Maven设置中发生的事情是旧版本的Ehcache(版本1.2.3),Hibernate附带的版本优先于我自己添加的版本(ehcache-web v 2.0.4&amp; ehcache-core 2.4) 0.6)。由于旧的Hibernate版本的Ehcache不支持在SimplePageCachingFilter中命名缓存,因此我遇到了错误。

答案很长:

为了解决这个问题,我在项目的pom.xml中排除了我的Hibernate依赖项中的Ehcache依赖项,如下所示:

<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

这告诉我来自Hibernate的net.sf.ehcache:ehcache:jar:1.2.3依赖关系来自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启动我的应用程序,一切都开始正常,不再有例外。 Ehcache日志还显示过滤器实际上正在工作并正在进行操作。

我真的要感谢@jeha帮助我,让我朝着正确的方向前进。