Ich habe eine AspectJ Trace-Routine der folgenden pointcuts loggen Methode Eintritts- und Austrittsbedingungen aufgebauter:Wie man eine anonyme innere Methode von einem Pointcut ausschließt?
public aspect Trace {
pointcut anyMethodExecuted(): execution (* biz.ianw.lanchecker.*.*(..)) && !within(Trace) && !within(is(AnonymousType));
pointcut anyConstructorExecuted(): execution (biz.ianw.lanchecker.*.new(..)) && !within(Trace);
In meiner sendemail-Klasse habe ich eine Methode, die die setDebugOut Methode ruft die Debug-Ausgabe auf einen LogOutputStream zu umleiten :
final private static Logger log = LoggerFactory.getLogger(MailMail.class);
...
LogOutputStream losStdOut = new LogOutputStream() {
@Override
protected void processLine(String line, int level) {
log.debug(line);
}
};
public void sendPlainHtmlMessage(...) {
Session session = javaMailSender.getSession();
PrintStream printStreamLOS = new PrintStream(losStdOut);
session.setDebugOut(printStreamLOS);
...
Dies funktioniert außer in Ordnung, dass die Trace-Klasse pointcut fängt die die anonyme innere Klasse den Anruf, als Ausgabe erzeugt:
20:14:18.908 TRACE [biz.ianw.lanchecker.Trace] - Enters method: Logger biz.ianw.lanchecker.MailMail.access$0()
20:14:18.909 TRACE [biz.ianw.lanchecker.Trace] - Exits method: Logger biz.ianw.lanchecker.MailMail.access$0().
20:14:18.909 TRACE [biz.ianw.lanchecker.Trace] - with return value: Logger[biz.ianw.lanchecker.MailMail]
20:14:18.909 DEBUG [biz.ianw.lanchecker.MailMail] - DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
Ich fügte hinzu, die eher zu weit gefassten
&& !within(is(AnonymousType))
Zustand zum pointcut, wie oben gezeigt, aber es hatte keine Wirkung. In der Tat habe ich wirklich Schwierigkeiten zu finden ist (AnonymousType) überall dokumentiert.
Wie kann ich einen Pointcut schreiben, der diese anonyme innere Methode ausschließt, vorzugsweise ohne andere zu beeinflussen?
Wissen Sie nicht, ob das verwandt ist? 'joinPoint.getStaticPart(). getSignature(). getDeclaringType(). isAnonymousClass()' gibt 'False' für' ... access $ 0() 'zurück. 'toLongString()' zeigt die Methodensignatur als: 'execution (static org.slf4j.Logger biz.ianw.lanchecker.MailMail.access $ 0())' – Ian