From b8106ae773c09cb7454cf9988fa494567d503f36 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Fri, 22 May 2015 16:10:43 +0200 Subject: [PATCH] Improve transaction manager detection Switch the condition used to trigger the creation of a transaction manager from the default name to the actual type. Fixes gh-3012 --- ...ceTransactionManagerAutoConfiguration.java | 5 ++-- ...nsactionManagerAutoConfigurationTests.java | 30 ++++++++++++++++++- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfiguration.java index b69baf379d..e004ac6af6 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2014 the original author or authors. + * Copyright 2012-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,6 +37,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; * {@link DataSourceTransactionManager}. * * @author Dave Syer + * @author Stephane Nicoll */ @Configuration @ConditionalOnClass({ JdbcTemplate.class, PlatformTransactionManager.class }) @@ -51,7 +52,7 @@ public class DataSourceTransactionManagerAutoConfiguration implements Ordered { private DataSource dataSource; @Bean - @ConditionalOnMissingBean(name = "transactionManager") + @ConditionalOnMissingBean @ConditionalOnBean(DataSource.class) public PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(this.dataSource); diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfigurationTests.java index 5cc53bc881..89df6cc483 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2014 the original author or authors. + * Copyright 2012-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,17 +20,22 @@ import javax.sql.DataSource; import org.junit.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.AbstractTransactionManagementConfiguration; import org.springframework.transaction.annotation.EnableTransactionManagement; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.mockito.Mockito.mock; /** * Tests for {@link DataSourceTransactionManagerAutoConfiguration}. * * @author Dave Syer + * @author Stephane Nicoll */ public class DataSourceTransactionManagerAutoConfigurationTests { @@ -67,9 +72,32 @@ public class DataSourceTransactionManagerAutoConfigurationTests { assertNotNull(this.context.getBean(DataSourceTransactionManager.class)); } + @Test + public void testExistingTransactionManager() { + this.context.register(SwitchTransactionsOn.class, + TransactionManagerConfiguration.class, + EmbeddedDataSourceConfiguration.class, + DataSourceTransactionManagerAutoConfiguration.class); + this.context.refresh(); + assertEquals("No transaction manager should be been created", 1, + this.context.getBeansOfType(PlatformTransactionManager.class).size()); + assertEquals("Wrong transaction manager", this.context.getBean("myTransactionManager"), + this.context.getBean(PlatformTransactionManager.class)); + } + @EnableTransactionManagement protected static class SwitchTransactionsOn { } + @Configuration + protected static class TransactionManagerConfiguration { + + @Bean + public PlatformTransactionManager myTransactionManager() { + return mock(PlatformTransactionManager.class); + } + + } + }