AspectJ Pointcut Definition mit Wildcards

sebastianb

Erfahrenes Mitglied
Hallo zusammen,

kennt jemand zufällig eine Möglichkeit folgende Pointcut-Definition für sämtliche Annotations im package javax.persistence (ManyToOne, ManyToMany usw.) zu definieren?

Code:
@Pointcut("execution(@javax.persistence.OneToMany(fetch=javax.persistence.FetchType.LAZY) * * (..)) // Funktioniert soweit

Sowas in der Art wie hier, nur funktionsfähig ;)

Code:
@Pointcut("execution(@javax.persistence.* (fetch=javax.persistence.FetchType.LAZY) * * (..))

Viele Grüße

Sebastian
 
Hallo,

beim funktionierts mit
Java:
@Pointcut("execution(@javax.persistence.* * * (..))")
	public void executionOfJpaAnnotatedMethod() {
	}
unter AspectJ 1.6.9 ohne Probleme ...

Welche AspectJ Version verwendest du denn? Verwendest du AspectJ über Load-time weaving aus Spring heraus?

Gruß Tom
 
Hi Thomas,

viele Dank für Deine schnelle Antwort. In meinem Projekt verwende ich die "latest" Artefakte über Maven - also 1.6.9 und als Weaver nutze ich das aspectj-maven-plugin (v1.3).
Dein hier beschriebener Pointcut funktioniert bei mir auch wunderbar, nur leider habe ich in meinem ersten Post vergessen zu erwähnen, dass nur die javax.persistence.* Annotations gecatcht werden sollen die zusätzlich das Attribut "fetch=javax.persistence.FetchType.LAZY" beinhalten.

Viele Grüße

Sebastian
 
Hallo,

ich glaube das was du machen möchtest wird von AspectJ stand heute (1.6.9) nicht unterstützt.
In Pointcut Ausdrücken können Annotation-Attribute nicht direkt ausgewertet werden. Auch der Zugriff auf (bzw. das Binden) einer Annotation von einem Pointcut (analog zu arg(...), target(...) etc.) wird noch nicht direkt unterstützt.

hier ein paar verwandete Bugs / Feature Requests:

Bug 133340 - [annotations] Evaluation of Annotations in if-pointcut
https://bugs.eclipse.org/bugs/show_bug.cgi?id=133340

Bug 321820 - Declare annotation to a method param
https://bugs.eclipse.org/bugs/show_bug.cgi?id=321820

Am besten machst du ein minimales Beispiel und stellst einen Feature Request beim AspectJ Projekt ein.

Wenn du in einem Advice abhängig von bestimmten Annotation-Werten ausführen möchtest so kannst du dir am JoinPoint bzw. JointPointStaticPart das entsprechende Ziel "abholen" und dort per Reflection auf die Annotation zugreifen und den Wert selber auswerten.

Gruß Tom
 
Hi Thomas,

ich habe mir nun folgendes Konstrukt gebaut.

Code:
@Pointcut("execution(@javax.persistence.OneToMany(fetch=javax.persistence.FetchType.LAZY) * * (..)) || "
      + "execution(@javax.persistence.ManyToMany(fetch=javax.persistence.FetchType.LAZY) * * (..)) ||"
      + "execution(@javax.persistence.ManyToOne(fetch=javax.persistence.FetchType.LAZY) * * (..)) ||"
      + "execution(@javax.persistence.OneToOne(fetch=javax.persistence.FetchType.LAZY) * * (..))")

Die Idee mit der Auswertung zur Laufzeit hatte ich zwar auch schon, da ich aber im Verhältnis recht wenige Lazy-Objekte habe, möchte ich ungern jeden Aufruf abfangen um dann eine Fallentscheidung durchführen.
Mit der Lösung nun bin zwar auch nicht ganz zufrieden aber wenn das wirklich so nicht untersützt wird, habe ich wenigstens eine Entschuldigung für meinen Prof ;)

Viele Grüße und besten Dank

Sebastian
 
Zurück