2011-01-03 5 views
0

Ich habe ein Web-Projekt mit Tapestry 5.2.1 gebaut. Ich habe einen einfachen Protokollierungsaspekt, den ich für die Verfolgung dieser Anwendung verwendet habe. Alles funktionierte einwandfrei, bis ich mit der Umgestaltung von Teilen der Anwendung begonnen und versucht habe, sie zu implementieren.NoAspectBoundException mit aspectj und Tapisserie 5

Wenn ich die Anwendung bereitstellen, unabhängig davon, welche Seite ich versuche zu gehen, ich die folgende Ausnahme erhalten:

Caused by: java.lang.RuntimeException: Exception assembling root component of page Index: Exception while initializing TraceAspect: org.aspectj.lang.NoAspectBoundException: TraceAspect 
    at org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl.performAssembleRootComponent(ComponentAssemblerImpl.java:124) 
    at org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl.access$000(ComponentAssemblerImpl.java:38) 
    at org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl$1.invoke(ComponentAssemblerImpl.java:82) 
    at org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl$1.invoke(ComponentAssemblerImpl.java:79) 
    at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:65) 
    ... 73 more 
Caused by: org.aspectj.lang.NoAspectBoundException: Exception while initializing TraceAspect: org.aspectj.lang.NoAspectBoundException: TraceAspect 
    at TraceAspect.aspectOf(TraceAspect.aj:1) 
    at com.wex.rrt.wrightweb.reportrequest.webapp.pages.Index.initializer(Index.java:3) 
    at com.wex.rrt.wrightweb.reportrequest.webapp.pages.Index.<init>(Index.java) 
    at $Instantiator_12d4da06f67.newInstance($Instantiator_12d4da06f67.java) 
    at org.apache.tapestry5.internal.structure.InternalComponentResourcesImpl.<init>(InternalComponentResourcesImpl.java:146) 
    at org.apache.tapestry5.internal.structure.ComponentPageElementImpl.<init>(ComponentPageElementImpl.java:593) 
    at org.apache.tapestry5.internal.structure.ComponentPageElementImpl.<init>(ComponentPageElementImpl.java:609) 
    at org.apache.tapestry5.internal.pageload.ComponentAssemblerImpl.performAssembleRootComponent(ComponentAssemblerImpl.java:93) 
    ... 77 more 
Caused by: org.aspectj.lang.NoAspectBoundException: TraceAspect 
    at TraceAspect.aspectOf(TraceAspect.aj:1) 
    at AbstractLoggingAspect.<init>(AbstractLoggingAspect.aj:7) 
    at TraceAspect.<init>(TraceAspect.aj:12) 
    at TraceAspect.ajc$postClinit(TraceAspect.aj:1) 
    at TraceAspect.<clinit>(TraceAspect.aj:1) 
    ... 84 more 

Mein Aspekt ist unverändert geblieben und das ist:

@Aspect 
public class TraceAspect { 

    Logger logger = Logger.getLogger("trace"); 

    public TraceAspect() { 
     logger.setLevel(Level.ALL); 
    } 

    /** 
    * Will log every execution of 
    * <ul> 
    * <li>doEverything</li> 
    * <li>doSomething</li> 
    * </ul> 
    * excluding any test classes. 
    */ 
    @Pointcut("(execution(public void *(..)) || execution(*.new(..))) && !within(*Test) !within(com.aspects.*)") 
    protected void logging() { 
    } 

    @Around("logging()") 
    public void doThing(final ProceedingJoinPoint thisJoinPoint) throws Throwable { 
     final String joinPointName = thisJoinPoint.getThis().getClass().getSimpleName() + "." + thisJoinPoint.getSignature().getName() + "()"; 
     logger.info("Entering [" + joinPointName + "]"); 
     thisJoinPoint.proceed(); 
     logger.info("Leaving [" + joinPointName + "]"); 
    } 
} 

Beim Übersetzen Alles funktioniert gut. Ich verwende das Maven Plugin die Aspekte zu kompilieren:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>aspectj-maven-plugin</artifactId> 
    <version>1.3</version> 
    <configuration> 
     <source>1.6</source> 
     <target>1.6</target> 
     <complianceLevel>1.6</complianceLevel> 
    </configuration> 
    <executions> 
     <execution> 
      <goals> 
       <goal>compile</goal> 
       <goal>test-compile</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Ich habe an diesem off arbeiten und die meiste Zeit des Tages und nicht überall bekommen. Ich verstehe nicht genau die NoAspectBoundException. Es scheint, dass der Compiler den Aspekt nicht vollständig verwebt? Ich bin neu in AspectJ aber ich frage mich, ob das etwas mit Tapestry5 zu tun hat. Obwohl ich weiß, dass Tap5 AOP verwendet.

Wie gesagt, das war alles funktioniert, wie es gut ist, bis ich einige Dinge in eine separate Tapisserie benutzerdefinierte Bibliothek, die jetzt eine Abhängigkeit für meine Web-App ist.

Antwort

0

Ich denke, wir haben einen Konflikt von AOP. AspectJ hat etwas mit dem Code getan, und dann kommt Tapestry und macht etwas anderes ... einschließlich des Ignorierens existierender Klassenkonstruktoren in der Komponentenklasse und des Hinzufügens eines eigenen. Ich bin mir nicht sicher, wie ich die beiden zusammenbringen soll.

4

Sie beraten den Konstruktor des Aspekts aufgrund des unbeschränkten execution(*.new(..)) Teils des Pointcuts. Wenn der Aspekt instanziiert wird, hat der Hinweis keine Instanz des Aspekts, daher der Fehler. Sie sollten das beheben können, indem Sie !within([package of].TraceAspect) hinzufügen.

+0

Aktualisiert mein Aspekt oben. Ich habe "!" Innerhalb von (com.aspects. *) Hinzugefügt und bekomme immer noch dieselbe Ausnahme, wenn ich auf eine Seite zugreife. – Casey

+0

Ich habe auch versucht, das Paket der Komponentenbibliothek auszuschließen, aber das führte zu der gleichen Ausnahme wie oben. – Casey

+0

Ich weiß nicht viel über Tapestry, aber ist der Aspekt nicht sichtbar für den Klassenlader, der Tapestry-Komponenten lädt? – ramnivas