Причина, по которой я хочу это сделать, заключается в том, что мое приложение Spring Boot не знает конфигурации базы данных в начале приложения. После запуска приложения пользователь отправит конфигурации базы данных в теле HTTP-запроса, и на основе этих конфигураций приложению необходимо будет инициализировать все эти экземпляры. Вот почему я не могу инициализировать их в начале приложения как bean-компоненты, управляемые Spring.
Настройка исполнителей запросов (например, JdbcTemplate, NamedParameterJdbcTemplate, EntityManager) ) после запуска приложения это легко, я борюсь с настройкой менеджеров транзакций.
Для настройки DataSourceTransactionManager я думаю использовать следующий подход :
- Создайте класс DynamicTransactionManager, реализующий PlatformTransactionManager, и откройте его как компонент Spring.
- Как только конфигурация базы данных станет доступна во время выполнения, инициализируйте DataSourceTransactionManager внутри DynamicTransactionManager.
< /li>
Код: Выделить всё
DynamicTransactionManager:
@Component("DynamicTransactionManager")
public class DynamicTransactionManager implements PlatformTransactionManager {
private DataSource dataSource;
private DataSourceTransactionManager transactionManager;
// pass the datasource once the db config is available
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
this.transactionManager = new DataSourceTransactionManager (dataSource);
}
@Override
public TransactionStatus getTransaction (TransactionDefinition definition) throws TransactionException {
return transactionManager.getTransaction (definition);
}
@Override
public void commit (TransactionStatus status) throws TransactionException {
log.info("Transaction Committed");
transactionManager.commit(status);
}
@Override
public void rollback(TransactionStatus status) throws TransactionException {
log.info("Rolling back the transaction");
transactionManager.rollback(status);
}
}
Похоже, что это работает нормально для некоторых базовых сценариев счастливого пути.
p>
Я попробовал то же самое для создания динамического JpaTransactionManager. Но, похоже, это не работает.
Когда я выполняю запрос на удаление с помощью EntityManager, я получаю ошибку javax.persistence.TransactionManagerRequried, даже если метод помечен @Transactional("DynamicJpaTransactionManager" ) аннотация.
Код: Выделить всё
@Component("DynamicJpaTransactionManager")
public class DynamicJpaTransactionManager implements PlatformTransactionManager {
private JpaTransactionManager jpaTransactionManager;
// pass the entityManagerFactory once the db config is available
public void setJpaTransactionManager(EntityManagerFactory entityManagerFactory){
jpaTransactionManager = new JpaTransactionManager (entityManagerFactory);
}
@Override
public TransactionStatus getTransaction (TransactionDefinition definition) throws TransactionException {
return jpaTransactionManager.getTransaction (definition);
}
@Override
public void commit (TransactionStatus status) throws TransactionException {
log.info("Transaction Committed");
jpaTransactionManager.commit(status);
}
@Override
public void rollback(TransactionStatus status) throws TransactionException {
log.info("Rolling back the transaction");
jpaTransactionManager.rollback(status);
}
}
- Правильный ли это способ динамической настройки диспетчеров транзакций?
- Есть ли причина, по которой Spring не распознает DynamicJpaTransactionManager?
Подробнее здесь: https://stackoverflow.com/questions/781 ... -boot-appl
Мобильная версия