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());
}
}
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?
Mobile version