我有一个非常基本的设置:Struts2 Web应用程序,将其添加到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 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>
当应用程序部署在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;
在net.sf.ehcache.CacheManager.replaceCacheWithDecoratedCache(CacheManager.java:950)处是:
// NPE guard
if (cacheName == null || cacheName.length() == 0) {
return;
} <-- this is line 950
我知道我严重错过了一些东西,但我不知道是什么.已经做完这件事的人可以告诉我我做错了什么,或者我错过了什么.我只想对HTML内容进行一些简单的缓存.谢谢!
解决方法:
} <-- this is line 950
我认为这不是有问题的代码行-您是否查看了正确的源代码?快速浏览一下,CacheManager.replaceCacheWithDecoratedCache of Ehcache version 1.5是一个更有希望的:
if (!ehcache.equals(decoratedCache)) { // line 950
解释NPE,这意味着ehcache为null.
在ehcache.xml中将缓存命名为SimplePageCachingFilter:
<cache name="SimplePageCachingFilter" ... />
它会工作.原因是SimplePageCachingFilter
必须具有一个名为SimplePageCachingFilter的缓存!出于相同的原因,您可以从web.xml中省略cacheName的init参数.