Как настроить TransactionManager во время выполнения после запуска приложения Spring Boot?JAVA

Программисты JAVA общаются здесь
Ответить
Гость
 Как настроить TransactionManager во время выполнения после запуска приложения Spring Boot?

Сообщение Гость »

Я хочу установить исполнителей запросов (например, JdbcTemplate, NamedParameterJdbcTemplate, EntityManager) и менеджеров транзакций (например, DataSourceTransactionManager, JpaTransactionManager) во время выполнения после запуска приложения Spring Boot.
Причина, по которой я хочу это сделать, заключается в том, что мое приложение 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);
}
}
Как только конфигурация базы данных становится доступной, она вызывает метод setDataSource этого класса.
Похоже, что это работает нормально для некоторых базовых сценариев счастливого пути.
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»