Ist es möglich, Methodenaufrufe auf einem JDBI-DAO mithilfe aspektorientierter Programmierung zu überprüfen?Java

Java-Forum
Anonymous
 Ist es möglich, Methodenaufrufe auf einem JDBI-DAO mithilfe aspektorientierter Programmierung zu überprüfen?

Post by Anonymous »

Wir verwenden hauptsächlich Jdbi.onDemand mit DAO-Schnittstellen, um mit unserem RDS zu interagieren.
Ich versuche, transparent zu machen, wann jede DAO-Methode aufgerufen wird.
Wir haben Hunderte von Methoden über Dutzende von Schnittstellen hinweg, daher ist das Hinzufügen von Protokollen zu jedem einzelnen Aufruf unpraktisch.
Ich hatte gehofft, einen AOP-Ratschlag zu verwenden, der auf JDBI-Anmerkungen auf der Schnittstelle basiert Methoden. Wir haben @annotation-Ratschläge für einige Controller-Methoden, die gut funktionieren, aber der gleiche Ansatz funktioniert nicht für DAO-Methoden.
Ich vermute, dass das daran liegt, dass sowohl Spring AOP als auch JDBI funktionieren, indem sie Proxy-Klassen basierend auf der Schnittstelle erstellen, sodass JDBI eine Instanz abrufen und diese für die Interaktion mit der Datenbank verwenden kann, aber mein Aspekt kann diese Instanz nicht „sehen“, um den Rat anzuwenden. Ich bin allerdings ziemlich neu in diesem Bereich und verstehe die Details immer noch nicht.
Beispielprojekt auf GitHub: https://github.com/Vaent/jdbi-aop-example
Beispielcode-Schnipsel (vereinfacht):

Code: Select all

@Service
public class MyService {
@Autowired
private Jdbi jdbi;

public Long getCount() {
// MyDAO#getCount is invoked as expected
return jdbi.onDemand(MyDAO.class).getCount();
}
}

Code: Select all

public interface MyDAO {
@SqlQuery("SELECT COUNT(*) FROM myschema.mytable")
public Long getCount();
}

Code: Select all

@Aspect
@Component
public class MyAspect {
@Before("@annotation(sqlQuery)")
public void queryAdvice(SqlQuery sqlQuery) {
// When the service method is invoked, I expect this to be printed, but nothing happens
System.out.println("Executing query: " + sqlQuery.value());
}
}
Ich habe verschiedene Beratungstypen und verschiedene Pointcut-Ausdrücke einschließlich Bean und Ausführung ausprobiert, wobei ich eine separate Pointcut-Methode verwendet und eine benutzerdefinierte Annotation anstelle der JDBI-Annotation verwendet habe. Nichts, was ich versucht habe, scheint irgendeinen Unterschied zu machen.
Gibt es eine Problemumgehung oder eine Möglichkeit, den Aspekt/die Schnittstelle so zu konfigurieren, dass die On-Demand-Erweiterung von JDBI mit AspectJ/Spring AOP/einem anderen aspektorientierten Framework interagieren kann?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post