2012-03-15 29 views
5

Recibo este error en mi aplicación de primavera (primavera 3.1), y no sé por qué.NoClassDefFoundError con spring cache y aspectj

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

(el $AjcClosure1 es raro)

Si comento la anotación @Cacheable en la clase a continuación el error se ha ido.

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

    } 

Mi clase controlador (simplificado):

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


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

Aplicación Contexto (sólo una parte de caché):

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

me trató proxy y el modo aspectj (en modo de proxy menos errores pero el caché no estaba haciendo nada)

Esta aplicación web se construyó inicialmente con roo y usa mv de primavera c y webflow. Entonces, hay bastante xml en applicationContext.xml o webmvc-config.xml (y no puedo entender lo que algunos beans están haciendo). Estoy ejecutando el wepapps en eclipse con m2e-wtp y el pom.xml está usando el plug-in aspectj-maven-plugin (pero no tengo idea de qué se trata)

Parece que el problema está relacionado con aspectj, pero nunca usé aspectJ. Si cualquier gurú de spring/java/aspectj me puede explicar qué está haciendo este error y cómo puedo hacer que funcione mi caché, ¡sería increíble! (Pude encontrar solo un tutorial pero no un proyecto de muestra con la anotación almacenable en caché).

+0

Actualiza la carpeta de destino, mira http://stackoverflow.com/questions/16283268/how-to-deploy-generated-resources-to-tomcat-with-m2e-wtp – xmedeko

Respuesta

0

Un problema (puede que no sea el que causa el NoClassDefFoundError) es que puede usar funciones de resorte como @Cacheable solo para Spring Beans. Entonces, si creas una clase a través del new (y esta clase no está anotada por @Configurable) entonces esta es una clase normal y no un Spring Bean. Por lo tanto, la anotación se ignora en el modo proxy. - Puede que esto también dé como resultado este error de estancamiento en el modo AspectJ, pero no lo sé.

+0

Gracias, esto me está ayudando un poco, yo ¡Comienza a entender mejor cómo funciona la cosa! pero creé una interfaz y declare un bean en el contexto de la aplicación, y lo conecté automáticamente en el controlador con el mismo error. Voy a ver la etiqueta @configurable – jpprade

+1

Ok, creo que encontré que el problema proviene de eclipse o wtp pluggin, si compruebo la ruta de destino en eclipse hay una compilación myclass $ AjcClosure1 pero si miro en tomcat este archivo no está publicado – jpprade

3

Parece que el problema proviene del hecho de que toda la clase $ AjcClosure [n] .class no está publicada y la única forma de hacerlo es eliminar, las webapps, limpiar el inicio y volver a publicar la aplicación web.

Cuestiones relacionadas