我有一个非常基本的设置: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!
答案 0 :(得分:2)
} <-- this is line 950
我不认为这是有问题的代码行 - 您是否看过正确的来源?从快速看,CacheManager.replaceCacheWithDecoratedCache of Ehcache version 1.5,更有前途:
if (!ehcache.equals(decoratedCache)) { // line 950
这意味着,解释NPE,ehcache
是null
。
在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帮助我,让我朝着正确的方向前进。