2012-03-15 1 views
5

Я получаю эту ошибку в моем весеннем webapp (весна 3.1), и я не знаю почему.NoClassDefFoundError с весенним кешем и аспектом

org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is 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(); 
     ... 
    } 
} 

Application Context (только кэш-часть):

<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 (в режиме прокси меньше ошибок но кеш ничего не делал)

Это веб-приложение было первоначально создано с использованием roo и использовать весенний mvc и веб-поток. Таким образом, в applicationContext.xml или webmvc-config.xml довольно много xml (и я не могу понять, что делают некоторые компоненты). Я запускаю wepapps в затмении с m2e-wtp, а pom.xml использует плагин-аспектj-maven-плагин (но не знаю, что он делает)

Похоже, проблема связана с аспектом, но я никогда не использовал aspectJ. Если кто-нибудь из весенних/java/aspectj гуру может объяснить мне, что делает эту ошибку, и как я могу заставить работать мой кеш, это было бы потрясающе! (Я мог бы найти только учебник, но не образец проекта с использованием кэшируемой аннотации).

+0

Обновить целевую папку, см. Http://stackoverflow.com/questions/16283268/how-to-deploy-generated-resources-to-tomcat-with-m2e-wtp – xmedeko

ответ

0

Одна из проблем (возможно, не такая, которая вызывает NoClassDefFoundError) состоит в том, что вы можете использовать функции Spring, такие как @Cacheable только для Spring Beans. Поэтому, если вы создаете класс через new (и этот класс он не аннотируется @Configurable), то это обычный класс, а не компонент Spring. Поэтому аннотация игнорируется в режиме прокси. - Возможно, это также приведет к этой неустойчивой ошибке в режиме AspectJ, но я не знаю.

+0

Спасибо, это мне немного помогает, я начните лучше понимать, как все работает! , но я создал интерфейс и объявляю компонент в контексте приложения, а также автоопределяю его в контроллере с той же ошибкой. Я посмотрю на @configurable tag – jpprade

+1

. Хорошо, я думаю, что проблема возникла из eclipse или wtp pluggin. Если я проверил целевой путь в eclipse, есть скомпилированный myclass $ AjcClosure1, но если я посмотрю в tomcat, этот файл не будет опубликован – jpprade

3

Похоже, проблема связана с тем, что весь класс $ AjcClosure [n] .class не опубликован, и единственный способ сделать это - удалить, webapps, очистить запуск и опубликовать webapp.