Java 使用spring缓存和aspectj的NoClassDefFoundError
我在我的SpringWebApp(Spring3.1)中遇到了这个错误,我不知道为什么 org.springframework.web.util.NestedServletException:处理程序 处理失败;嵌套异常为java.lang.NoClassDefFoundError: mypackage/TestCache$AjcClosure1 (Java 使用spring缓存和aspectj的NoClassDefFoundError,java,spring,spring-mvc,aspectj,ehcache,Java,Spring,Spring Mvc,Aspectj,Ehcache,我在我的SpringWebApp(Spring3.1)中遇到了这个错误,我不知道为什么 org.springframework.web.util.NestedServletException:处理程序 处理失败;嵌套异常为java.lang.NoClassDefFoundError: mypackage/TestCache$AjcClosure1 ($AjcClosure1很奇怪) 如果我在下面的类中注释注释@Cacheable,则错误消失 public class TestCache {
$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;
}
}
应用程序上下文(仅缓存部分):
我尝试了proxy和aspectj模式(在proxy模式下没有错误,但缓存什么也没做)
这个web应用程序最初是用roo构建的,并使用SpringMVC和webflow。因此applicationContext.xml或webmvc-config.xml中有很多xml(我无法理解一些bean在做什么)。
我使用m2e wtp在eclipse中运行WEPAPP,pom.xml使用插件aspectj maven插件(但不知道它做什么)
看起来这个问题与aspectj有关,但我从未使用过aspectj。
如果任何spring/java/aspectj专家能够解释是什么导致了这个错误,以及我如何使我的缓存工作,那就太棒了!(我只能找到教程,但没有使用可缓存注释的示例项目)。一个问题(可能不是导致NoClassDefFoundError的问题)是,您只能对SpringBean使用类似于
@cacheable
的Spring函数。因此,如果您通过new
创建一个类(并且这个类没有被@Configurable
注释),那么这是一个普通类,而不是Springbean。因此,在代理模式下忽略注释。-可能这也会导致AspectJ模式下出现此stange错误,但我不知道。问题似乎源于所有类$AjcClosure[n]。类都没有发布,唯一的方法是删除、删除webapps、干净启动并重新发布webapp。谢谢这对我有点帮助,我开始更好地理解事情是如何运作的!但是我创建了一个接口,并在应用程序上下文中声明了一个bean,然后在控制器中自动连接它,并出现了相同的错误。我将查看@configurable标记OK我想我发现问题来自eclipse或wtp pluggin,如果我检查eclipse下的目标路径,有一个已编译的myclass$AjcClosure1,但是如果我在tomcat中查看此文件未发布刷新目标文件夹,请参阅
@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"/>