带有spring cache和aspectj的NoClassDefFoundError

jpp*_*ade 5 java spring aspectj spring-mvc ehcache

我在春季webapp(春季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;
        }

    }
Run Code Online (Sandbox Code Playgroud)

我的控制器类(简化):

@Controller
@RequestMapping("/mypage")
public class MyController {


    @RequestMapping
    public String index(ModelMap model, Locale locale) {
        TestCache tc = new TestCache();
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

应用程序上下文(仅缓存部分):

<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"/>
Run Code Online (Sandbox Code Playgroud)

我尝试了代理和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可以解释我是什么造成了这个错误以及我如何使我的缓存工作它会很棒!(我只能找到教程但没有使用可缓存注释的示例项目).

Ral*_*lph 0

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