带有弹簧缓存和aspectj的NoClassDefFoundError



我的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模式中导致这个奇怪的错误,但我不知道。

最新更新