From 6dc99eddaa1e86b74e8ee6743e120950569f177d Mon Sep 17 00:00:00 2001 From: mikereiche Date: Wed, 22 Feb 2023 11:57:32 -0800 Subject: [PATCH] Eliminate need to override transactionInterceptor bean. Closes #1665. --- .../AbstractCouchbaseConfiguration.java | 45 +++++++++++++------ 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java b/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java index 9eacc4c26..9dc777f64 100644 --- a/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java +++ b/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java @@ -26,7 +26,11 @@ import java.util.Map; import java.util.Set; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; import org.springframework.context.annotation.Configuration; @@ -63,6 +67,8 @@ import org.springframework.data.mapping.model.PropertyNameFieldNamingStrategy; import org.springframework.transaction.TransactionManager; import org.springframework.transaction.annotation.AnnotationTransactionAttributeSource; +import org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration; +import org.springframework.transaction.config.TransactionManagementConfigUtils; import org.springframework.transaction.interceptor.TransactionAttributeSource; import org.springframework.transaction.interceptor.TransactionInterceptor; import org.springframework.transaction.support.TransactionTemplate; @@ -374,19 +380,32 @@ public CouchbaseTransactionalOperator couchbaseTransactionalOperator( return CouchbaseTransactionalOperator.create(couchbaseCallbackTransactionManager); } - @Bean - @Role(BeanDefinition.ROLE_INFRASTRUCTURE) - public TransactionInterceptor transactionInterceptor(TransactionManager couchbaseTransactionManager) { - TransactionAttributeSource transactionAttributeSource = new AnnotationTransactionAttributeSource(); - TransactionInterceptor interceptor = new CouchbaseTransactionInterceptor(couchbaseTransactionManager, - transactionAttributeSource); - interceptor.setTransactionAttributeSource(transactionAttributeSource); - if (couchbaseTransactionManager != null) { - interceptor.setTransactionManager(couchbaseTransactionManager); - } - return interceptor; - } - + @Bean + @Role(BeanDefinition.ROLE_INFRASTRUCTURE) + static BeanPostProcessor transactionInterceptorCustomizer( + ObjectProvider transactionManagerProvider, ConfigurableListableBeanFactory beanFactory) { + + BeanPostProcessor processor = new BeanPostProcessor() { + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof TransactionInterceptor) { + TransactionAttributeSource transactionAttributeSource = new AnnotationTransactionAttributeSource(); + TransactionManager transactionManager = transactionManagerProvider.getObject(); + TransactionInterceptor interceptor = new CouchbaseTransactionInterceptor(transactionManager, + transactionAttributeSource); + interceptor.setTransactionAttributeSource(transactionAttributeSource); + if (transactionManager != null) { + interceptor.setTransactionManager(transactionManager); + } + return interceptor; + } + return bean; + } + + }; + beanFactory.addBeanPostProcessor(processor); + return processor; + } /** * Configure whether to automatically create indices for domain types by deriving the from the entity or not. */