2012-08-27 14 views
6

Ich habe den folgenden Aspekt: ​​keine passenden Factory-Methode gefunden: Factory-Methode 'aspectOf()'

package trc.suivi.aspects; 

import java.util.Date; 

import org.apache.log4j.Logger; 
import org.springframework.beans.factory.annotation.Autowired; 

import trc.suivi.domain.EvenementPli; 
import trc.suivi.domain.Pli; 
import trc.suivi.domain.TypeEvenement; 
import trc.suivi.repository.EvenementPliRepository; 

public aspect PliEventManagerAspect { 

    private static final Logger log = Logger.getLogger(PliEventManagerAspect.class); 

    @Autowired 
    private EvenementPliRepository evenementPliRepository; 

    public PliEventManagerAspect() { 
    } 

    pointcut catchEMPersist(Pli pli) : (execution(* trc.suivi.repository.PliRepository+.save(*)) && args(pli)); 
    pointcut catchEMPersist() : (execution(trc.suivi.domain.Pli.persist())); 

    after(Pli pli) returning: catchEMPersist(pli) { 
     log.debug("catchEMPersist(pli)"); 
     EvenementPli ev = new EvenementPli(); 
     ev.setDateCreation(new Date()); 
     ev.setType(TypeEvenement.creation); 
     ev.setMessage("Création d'un pli"); 
     evenementPliRepository.save(ev);   
    } 

    after() returning: catchEMPersist() { 
     log.debug("catchEMPersist()"); 
     EvenementPli ev = new EvenementPli(); 
     ev.setDateCreation(new Date()); 
     ev.setType(TypeEvenement.creation); 
     ev.setMessage("Création d'un pli"); 
     evenementPliRepository.save(ev);   
    } 

} 

Und den folgenden XML-config:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> 
    <aop:aspectj-autoproxy /> 
    <bean class="trc.suivi.aspects.PliEventManagerAspect" factory-method="aspectOf"/> 
</beans> 

Wenn ich meine app starten, erhalte ich dies ist:

No matching factory method found: factory method 'aspectOf()'. Check that a method with the specified name exists and that it is static. 

Ich bin ziemlich verblüfft, da ich ziemlich sicher bin, dass diese Konfiguration zuvor gut funktionierte. Was ist mehr ist dies ein Spring Roo Projekt, so dass alle aspectJ config in Ordnung sein sollte.

Kann mir bitte jemand helfen?

Antwort

3

Dies ist wahrscheinlich, weil Ihr Aspekt aus irgendeinem Grund nicht erstellt hat, können Sie mehr Diagnose zu Ihrem aspectj Weber Plugin versuchen und fügen Sie und sehen, was auf der Konsole gedruckt wird, in diese Richtung:

<configuration> 
    <outxml>true</outxml> 
    <showWeaveInfo>false</showWeaveInfo> 
    <Xlint>warning</Xlint> 
    <verbose>true</verbose> 
       ... 
</configuration> 

Da Sie root aspectj verwenden, müssen Sie nicht unbedingt <aop:aspectj-autoproxy/> verwenden, um Spring AOP auszulösen.

+0

Ich konnte aufgrund Ihres Vorschlags herausfinden, warum der Aspekt nicht kompiliert wurde. Danke vielmals. – balteo

+0

@balteo, können Sie angeben, was die Antwort auf Ihr spezielles Problem war? – alfredaday

+1

Mein Aspekt hatte nicht kompiliert. Wenn deins nicht kompiliert wird, versuchen Sie die obige Konfiguration, Sie werden die Kompilierungsfehler sehen. – balteo

2

Ich hatte die gleiche Fehlermeldung kommen. Ich löste es von hier an rozky Antwort suchen:

rozky schrieb:

Hallo,

I http://forum.springsource.org/showthread.php?79928-NoSuchMethodError-Aspect-aspectOf%28%29

Aus Gründen der die Antwort der Aufnahme habe ich es hier kopiert hatte ein gleiches Problem. Ich fand heraus, dass das Weben auch für Aspektklassen in der Datei aop.xml aktiviert werden muss. In Ihrem Fall ist es (siehe hervorgehobenen Teil):

<!DOCTYPE aspectj PUBLIC 
     "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"> 
<aspectj> 
    <weaver options="-verbose -showWeaveInfo -debug"> 
     <!-- only weave classes in our application-specific packages --> 
     <include within="com.mypackage.*"/> 
     <include within="foo.*"/> <!-- this is the highlighted line --> 
    </weaver> 
    <aspects> 
     <!-- weave in just this aspect --> 
     <aspect name="foo.ProfilingAspect"/> 
    </aspects> 
</aspectj> 

Ich hoffe, es hilft.