Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用spring缓存和aspectj的NoClassDefFoundError_Java_Spring_Spring Mvc_Aspectj_Ehcache - Fatal编程技术网

Java 使用spring缓存和aspectj的NoClassDefFoundError

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 {

我在我的SpringWebApp(Spring3.1)中遇到了这个错误,我不知道为什么

org.springframework.web.util.NestedServletException:处理程序 处理失败;嵌套异常为java.lang.NoClassDefFoundError: mypackage/TestCache$AjcClosure1

$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"/>