Проблема возникает из-за наличия нескольких менеджеров транзакций в контексте:
@Import({FooDataSourceConfig.class, BarDataSourceConfig.class})
public class ChainedDataSourceConfig implements TransactionManagementConfigurer {
private PlatformTransactionManager transactionManager;
@Autowired
public ChainedDataSourceConfig(@Qualifier("fooTransactionManager") PlatformTransactionManager fooTransactionManager,
@Qualifier("barTransactionManager") PlatformTransactionManager barTransactionManager) {
this.transactionManager = new ChainedTransactionManager(fooTransactionManager, barTransactionManager);
}
@Bean
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return transactionManager;
}
}
- Я не хотел устанавливать что-либо как @Primary, так как эта конфигурация должна быть импортирована в другие модуликоторым уже заданы другие bean-компоненты с такими же типами.
- Также проблематично было бы прибегать к тому, чтобы каждый транзакционный класс или метод именовал, какой транзакцииManager использовать:
@Transactional("someTransactionManager")
У меня есть служба, которая транзакционно использует оба источника данных:
@Service("fooBarService")
@Transactional
public class FooBarServiceImpl implements FooBarService {
@Override
public void doFooBar() {
doFoo();
doBar();
}
}
К вопросу:
Я хотел бы проверить, является ли настроенный транзакцияManager правильным.Идея состояла в том, чтобы иметь простой тест, который сломался бы, если бы кто-то испортил транзакционный конфиг
@RunWith(SpringRunner.class)
public class FooBarServiceImplTest {
@Autowired
private FooBarService fooBarService;
// @Autowired
// @Qualifier("annotationDrivenTransactionManager")
// @OtherOption
private PlatformTransactionManager transactionManager;
@Test
public void transactionManagerIsAChainedTransactionManager() {
assertTrue(transactionManager instanceof ChainedTransactionManager);
}
}
План не состоит в том, чтобы использовать @Qualifier ("annotationDrivenTransactionManager"), поскольку это скажет мне, если естьbean-компонент с именем annotationDrivenTransactionManager в контексте;не то, чтобы он использовался службой.
Есть ли какая-то аннотация с подобными @PersistenceContext, которую я мог бы использовать для этого?Могу ли я получить его из проводного сервиса (например, преобразовав его в прокси-сервер Spring)?