У меня есть интерфейс, для которого я хочу реализовать транзакционный вариант.
public interface Service {
void handle(Object message) throws Exception;
}
Моя реализация использует аннотацию, указывающую на необходимость транзакции.
В простейшей форме это будет
import jakarta.transaction.Transactional;
public class TransactionalService implements Service {
private final Service delegate;
public TransactionalService(Service delegate) {
this.delegate = delegate;
}
@Transactional(Transactional.TxType.REQUIRED)
@Override
public void handle(Object message) throws Exception {
this.delegate.handle(message);
}
}
Как я могу проверить, что аннотация соблюдена? Есть ли более простой способ проверки с помощью TransactionManager? Такое ощущение, что я делаю двойную работу.
import jakarta.transaction.Transaction;
import jakarta.transaction.TransactionManager;
import jakarta.transaction.Transactional;
public class TransactionalService implements Service {
private final TransactionManager transactionManager;
private final Service delegate;
public TransactionalService(TransactionManager transactionManager, Service delegate) {
this.transactionManager = transactionManager;
this.delegate = delegate;
}
@Transactional(Transactional.TxType.REQUIRED)
@Override
public void handle(Object message) throws Exception {
Transaction transaction = transactionManager.getTransaction();
if (transaction != null) {
this.delegate.handle(message);
} else {
throw new IllegalStateException("No transaction in current thread " + Thread.currentThread());
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... en-handled