Support primary TxMgrs and DataSources in the TCF
Prior to this commit, the transaction manager and data source look-up algorithms in the Spring TestContext Framework were not capable of retrieving 'primary' beans of those types, even though 'primary' beans are supported in production as well as for injecting dependencies into test instances. Specifically, if there was more than one transaction manager or data source bean and one of them was flagged as 'primary', the retrieveTransactionManager() and retrieveDataSource() methods in TestContextTransactionUtils would simply return null for such beans. This commit updates TestContextTransactionUtils by adding support for looking up primary transaction managers and data sources. Issue: SPR-13891
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2015 the original author or authors.
|
||||
* Copyright 2002-2016 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.
|
||||
@@ -17,6 +17,7 @@
|
||||
package org.springframework.test.context.transaction;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
@@ -73,7 +74,8 @@ public abstract class TestContextTransactionUtils {
|
||||
* <li>Look up the {@code DataSource} by type and name, if the supplied
|
||||
* {@code name} is non-empty, throwing a {@link BeansException} if the named
|
||||
* {@code DataSource} does not exist.
|
||||
* <li>Attempt to look up a single {@code DataSource} by type.
|
||||
* <li>Attempt to look up the single {@code DataSource} by type.
|
||||
* <li>Attempt to look up the <em>primary</em> {@code DataSource} by type.
|
||||
* <li>Attempt to look up the {@code DataSource} by type and the
|
||||
* {@linkplain #DEFAULT_DATA_SOURCE_NAME default data source name}.
|
||||
* @param testContext the test context for which the {@code DataSource}
|
||||
@@ -110,15 +112,21 @@ public abstract class TestContextTransactionUtils {
|
||||
if (dataSources.size() == 1) {
|
||||
return dataSources.values().iterator().next();
|
||||
}
|
||||
|
||||
try {
|
||||
// look up single bean by type, with support for 'primary' beans
|
||||
return bf.getBean(DataSource.class);
|
||||
}
|
||||
catch (BeansException ex) {
|
||||
logBeansException(testContext, ex, PlatformTransactionManager.class);
|
||||
}
|
||||
}
|
||||
|
||||
// look up by type and default name
|
||||
return bf.getBean(DEFAULT_DATA_SOURCE_NAME, DataSource.class);
|
||||
}
|
||||
catch (BeansException ex) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Caught exception while retrieving DataSource for test context " + testContext, ex);
|
||||
}
|
||||
logBeansException(testContext, ex, DataSource.class);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -133,7 +141,8 @@ public abstract class TestContextTransactionUtils {
|
||||
* <li>Look up the transaction manager by type and explicit name, if the supplied
|
||||
* {@code name} is non-empty, throwing a {@link BeansException} if the named
|
||||
* transaction manager does not exist.
|
||||
* <li>Attempt to look up the transaction manager by type.
|
||||
* <li>Attempt to look up the single transaction manager by type.
|
||||
* <li>Attempt to look up the <em>primary</em> transaction manager by type.
|
||||
* <li>Attempt to look up the transaction manager via a
|
||||
* {@link TransactionManagementConfigurer}, if present.
|
||||
* <li>Attempt to look up the transaction manager by type and the
|
||||
@@ -176,6 +185,14 @@ public abstract class TestContextTransactionUtils {
|
||||
return txMgrs.values().iterator().next();
|
||||
}
|
||||
|
||||
try {
|
||||
// look up single bean by type, with support for 'primary' beans
|
||||
return bf.getBean(PlatformTransactionManager.class);
|
||||
}
|
||||
catch (BeansException ex) {
|
||||
logBeansException(testContext, ex, PlatformTransactionManager.class);
|
||||
}
|
||||
|
||||
// look up single TransactionManagementConfigurer
|
||||
Map<String, TransactionManagementConfigurer> configurers = BeanFactoryUtils.beansOfTypeIncludingAncestors(
|
||||
lbf, TransactionManagementConfigurer.class);
|
||||
@@ -192,14 +209,18 @@ public abstract class TestContextTransactionUtils {
|
||||
return bf.getBean(DEFAULT_TRANSACTION_MANAGER_NAME, PlatformTransactionManager.class);
|
||||
}
|
||||
catch (BeansException ex) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Caught exception while retrieving transaction manager for test context " + testContext,
|
||||
ex);
|
||||
}
|
||||
logBeansException(testContext, ex, PlatformTransactionManager.class);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static void logBeansException(TestContext testContext, BeansException ex, Class<?> beanType) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug(String.format("Caught exception while retrieving %s for test context %s",
|
||||
beanType.getSimpleName(), testContext), ex);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a delegating {@link TransactionAttribute} for the supplied target
|
||||
* {@link TransactionAttribute} and {@link TestContext}, using the names of
|
||||
|
||||
Reference in New Issue
Block a user