我的spring-webapp(spring-3.1)中出现了这个错误,我不知道为什么。
org.springframework.web.util.NestedServlet异常:处理程序处理失败;嵌套异常为java.lang.NoClassDefFoundError:mypackage/TestCache$AjcClose1
($AjcClosure1
很奇怪)
如果我在下面的类中对注释@Cacheable
进行注释,那么错误就消失了。
public class TestCache {
@Cacheable(value ="myCache")
public List<String> getDummyList(){
Logger l = Logger.getLogger(this.getClass());
l.error("calling getDummyList");
ArrayList<String> foo = new ArrayList<String>();
foo.add("foo");
foo.add("bar");
return foo;
}
}
我的控制器类(简化):
@Controller
@RequestMapping("/mypage")
public class MyController {
@RequestMapping
public String index(ModelMap model, Locale locale) {
TestCache tc = new TestCache();
...
}
}
应用程序上下文(仅缓存部分):
<cache:annotation-driven mode="aspectj"/>
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cache-manager-ref="ehcache"/>
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:config-location="classpath:ehcache.xml"/>
我尝试了代理和aspectj模式(在代理模式下错误较少,但缓存什么都没做)
这个web应用程序最初是用roo构建的,使用springmvc和webflow。因此,applicationContext.xml或webmvc-config.xml中有相当多的xml(我无法理解一些bean在做什么)。我在eclipse中使用m2e wtp运行wepapps,pom.xml使用插件aspectj maven插件(但不知道它做什么)
这个问题似乎与aspectj有关,但我从未使用过aspectj。如果spring/java/aspectj大师能向我解释是什么导致了这个错误,以及我如何使我的缓存工作,那将是非常棒的!(我只能找到教程,但没有使用可缓存注释的示例项目)。
问题似乎来自于这样一个事实,即所有的类$AjcClose[n].class都没有发布,唯一的方法是删除Web应用程序,干净地启动并重新发布Web应用程序。
一个问题(可能不是导致NoClassDefFoundError的问题)是,您只能将类似@Cacheable
的Spring函数用于Spring Beans。因此,如果您通过new
创建一个类(并且这个类没有被@Configurable
注释),那么这是一个普通类,而不是Springbean。因此,在代理模式下会忽略注释。--也许这也会在AspectJ模式中导致这个奇怪的错误,但我不知道。