2012-03-15 5 views
5

Ricevo questo errore nella mia webapp di primavera (primavera 3.1) e non so perché.NoClassDefFoundError con spring cache e aspectj

org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.NoClassDefFoundError: mypackage/TestCache$AjcClosure1

(il $AjcClosure1 è strano)

Se io commento l'annotazione @Cacheable nella classe sotto l'errore è scomparso.

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; 
     } 

    } 

La mia classe controllore (semplificato):

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


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

contesto di applicazione (solo una parte della cache):

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

ho provato proxy e modalità AspectJ (in modalità proxy errore inferiore, ma la cache non stava facendo nulla)

Questa applicazione web è stata creata inizialmente con roo e usa spring mv c e webflow. Quindi c'è un bel po 'di xml in applicationContext.xml o webmvc-config.xml (e non sono in grado di capire cosa stanno facendo alcuni bean). Sto eseguendo i wepapp in eclissi con m2e-wtp e pom.xml utilizza il plug-in aspectj-maven-plugin (ma non ho idea di cosa sia)

Sembra che il problema sia correlato con aspectj, ma non ho mai usato l'aspettoJ. Se qualcuno spring/java/aspettoj guru può spiegarmi che cosa sta facendo questo errore e come posso far funzionare la cache sarebbe fantastico! (Ho potuto trovare solo tutorial ma nessun progetto di esempio usando l'annotazione memorizzabile nella cache).

+0

Aggiorna la cartella di destinazione, vedi http://stackoverflow.com/questions/16283268/how-to-deploy-generated-resources-to-tomcat-with-m2-wtp – xmedeko

risposta

0

Un problema (potrebbe non quello che causa NoClassDefFoundError) è che è possibile utilizzare Spring Functions come @Cacheable solo per Spring Beans. Quindi se crei una classe tramite new (e questa classe non è annotata da @Configurable) allora questa è una classe normale e non un bean Spring. Pertanto l'annotazione viene ignorata in modalità proxy. - Possa questo provocherà anche questo errore stangoso nella modalità AspectJ, ma non lo so.

+0

Grazie questo mi sta aiutando un po ', I inizia a capire meglio come funziona la cosa! ma ho creato un'interfaccia e dichiaro un bean nel contesto dell'applicazione, e lo autowire nel controller con lo stesso errore. Vedrò il tag @configurable – jpprade

+1

Ok penso di aver trovato il problema proveniente da eclipse o wp pluggin, Se controllo il percorso di destinazione in eclissi c'è un myclass compilato $ AjcClosure1 ma se guardo in tomcat questo file non è pubblicato – jpprade

3

Sembra che il problema derivi dal fatto che tutta la classe $ AjcClosure [n] .class non viene pubblicata e l'unico modo per farlo è rimuovere, le applicazioni web, avviare pulito e ripubblicare la webapp.