0 Tage Serie
java / expert
Snippet

Lösung der @Transactional-Selbstaufrufe mit ObjectProvider

Springs @Transactional basiert auf AOP-Proxies. Der direkte Aufruf einer transaktionalen Methode innerhalb derselben Klasse umgeht den Proxy. Die Nutzung von ObjectProvider zur Selbst-Injektion stellt sicher, dass der Aufruf über den Proxy erfolgt.

snippet.java
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Service
public class OrderService {
private final ObjectProvider<OrderService> self;
public OrderService(ObjectProvider<OrderService> self) {
this.self = self;
}
public void processOrder() {
// Self-invocation via proxy to ensure @Transactional is honored
self.getIfAvailable().saveToDatabase();
}
@Transactional
public void saveToDatabase() {
// Database logic here
}
}
spring
Erklärung
1
ObjectProvider<OrderService> self
Stellt eine verzögert geladene Referenz auf die Proxy-Version des aktuellen Beans bereit.
2
self.getIfAvailable().saveToDatabase()
Ruft die Methode auf dem Proxy auf, wodurch der Transaktions-Interceptor aktiviert wird.