带有spring cache和aspectj的NoClassDefFoundError

时间:2012-03-15 20:30:52

标签: java spring spring-mvc aspectj ehcache

我在春季网络应用程序(春季3.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;
        }

    }

我的控制器类(简化):

@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构建的,并使用spring mvc和webflow。所以applicationContext.xml或webmvc-config.xml中有相当多的xml(我无法理解一些bean在做什么)。 我使用m2e-wtp在eclipse中运行wepapps,而pom.xml正在使用插件aspectj-maven-plugin(但不知道它做了什么)

看起来问题与aspectj有关,但我从未使用aspectJ。 如果有人spring / java / aspectj guru可以解释我是什么造成了这个错误以及我如何使我的缓存工作它会很棒! (我只能找到教程但没有使用可缓存注释的示例项目。)

2 个答案:

答案 0 :(得分:3)

似乎问题来自于所有类$ AjcClosure [n] .class都没有发布的事实,唯一的方法是删除,webapps,干净启动并重新发布webapp。

答案 1 :(得分:0)

一个问题(可能不是导致NoClassDefFoundError的问题)是你可以只为Spring Bean使用像@Cacheable这样的Spring函数。因此,如果您通过new创建一个类(并且此类没有@Configurable注释)那么这是一个普通的类而不是Spring bean。因此,在代理模式下将忽略注释。 - 这可能会导致AspectJ模式中的这个stange错误,但我不知道。