Используйте Spring TransactionAwareDataSourceProxy в коде, а не xml - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь заставить работать транзакции jOOQ , за исключением использования кода вместо XML конфигурации. Я думаю, что это должно быть так же просто, как

// inside @Configuration annotated class
@Bean
public DataSource makeTransactionAware(DataSource fromConnectionPool) {
  return new TransactionAwareDataSourceProxy(fromConnectionPool);
}

, за исключением того, что я должен сказать Spring, что введенный DataSource не совпадает с возвращаемым из метода. Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

Пользовательское именование и квалификатор Bean должны выполнить всю работу за вас.

https://www.baeldung.com/spring-qualifier-annotation

@Bean(name = "txAwareDS")
public DataSource makeTransactionAware(@Qualifier("dataSource) DataSource fromConnectionPool) {
    return new TransactionAwareDataSourceProxy(fromConnectionPool);
}

Пример кода - это только отправная точка.

0 голосов
/ 21 февраля 2020

Из файла конфигурации Spring shared

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close" >
    <!-- These properties are replaced by Maven "resources" -->
   <property name="url" value="${db.url}" />
   <property name="driverClassName" value="${db.driver}" />
   <property name="username" value="${db.username}" />
   <property name="password" value="${db.password}" />
</bean>
<bean id="transactionAwareDataSource"
        class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
        <constructor-arg ref="dataSource" />
 </bean>

будет настроен как

@Configuration
@PropertySource("classpath:config.properties")
public class DataSourceConfig{

    @Value("${db.username}")
    private String username;
    @Value("${db.password}")
    private String password;
    @Value("${db.url}")
    private String url;

        @Bean
        public DataSource dataSource() {
            BasicDataSource basicDataSource = new BasicDataSource();
            basicDataSource.setDriverClassName("<driver class name>"); // Spring will load the driver discovered if not specified explicitly.
            basicDataSource.setUsername(username);
            basicDataSource.setPassword(password);
            basicDataSource.setUrl(url);
         return basicDataSource;
        }

        @Bean
        public TransactionAwareDataSourceProxy transactionAwareDataSource(DataSource dataSource) {
            return new TransactionAwareDataSourceProxy(dataSource)
        }
    }

Надеюсь, это поможет

...