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.
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
Ich habe auch versucht, das Paket der Komponentenbibliothek auszuschließen, aber das führte zu der gleichen Ausnahme wie oben. – Casey
Ich weiß nicht viel über Tapestry, aber ist der Aspekt nicht sichtbar für den Klassenlader, der Tapestry-Komponenten lädt? – ramnivas