Доступ к сконфигурированному TransactionManager, используемому системой @Transactional (например, для теста) - PullRequest
0 голосов
/ 23 сентября 2019

Проблема возникает из-за наличия нескольких менеджеров транзакций в контексте:

@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)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...