トランザクション、Spring Boot Starter JDBC&R2DBC

イヴァン・クリズサン:

JDBCテンプレートを使用したSpring Bootプロジェクトバージョン2.3.0.M3をR2DBCに移行しようとしています。このプロジェクトではLiquibaseも使用しているため、JDBCを完全に取り除くことはできません。プロジェクトにspring-boot-starter-data-r2dbcとspring-boot-starter-jdbcの両方の依存関係があり、いずれかのテストを実行しようとすると次の例外が発生します。

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.transaction.TransactionManager' available: expected single matching bean but found 2: transactionManager,connectionFactoryTransactionManager

    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1180)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:416)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:349)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:342)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.determineTransactionManager(TransactionAspectSupport.java:480)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:335)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)
...

Bean connectionFactoryTransactionマネージャーは、SpringクラスR2dbcTransactionManagerAutoConfigurationで次のように定義されています。

    @Bean
    @ConditionalOnMissingBean(ReactiveTransactionManager.class)
    public R2dbcTransactionManager connectionFactoryTransactionManager(ConnectionFactory connectionFactory) {
        return new R2dbcTransactionManager(connectionFactory);
    }

BeanのtransactionManagerは、SpringクラスのDataSourceTransactionManagerAutoConfigurationで次のように定義されています。

   @Bean
   @ConditionalOnMissingBean(PlatformTransactionManager.class)
   DataSourceTransactionManager transactionManager(DataSource dataSource,
           ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) {
       DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
       transactionManagerCustomizers.ifAvailable((customizers) -> customizers.customize(transactionManager));
       return transactionManager;
   }

ご覧のとおり、@ ConditionalOnMissingBeanアノテーションには、両方のBeanのインスタンスが作成される原因となるさまざまなタイプが含まれています。ただし、SpringクラスTransactionAspectSupportでは、determineTransactionManagerメソッドに次のコード行があります。

defaultTransactionManager = this.beanFactory.getBean(TransactionManager.class);

トランザクションマネージャーの種類であるDataSourceTransactionManagerとR2dbcTransactionManagerの両方がTransactionManagerインターフェイスを実装しているため、上記の両方のトランザクションマネージャーBeanが一致し、エラーが発生します。

この問題を解決または回避できた方がいらっしゃいますか。
前もって感謝します!

イヴァン・クリズサン:

M. Deinumsの回答(ありがとう!)からのインスピレーションを得て、次の手順をプロジェクトに適用し、以前に失敗したテストが正常に実行されるようになりました。

  • spring-boot-starter-jdbc依存関係を削除します。
  • spring-jdbcに依存関係を追加します。
  • HikariCP(com.zaxxer)に依存関係を追加します。
  • spring.liquibaseのユーザープロパティとパスワードプロパティを追加します(urlプロパティとchange-logプロパティは既にありました)。
  • すべてのspring.datasourceプロパティを削除します(urlとdrive-class-nameがありました)。

spring.r2dbcプロパティのユーザー名、パスワード、およびURLを定義しましたが、変更する必要はありませんでした。

更新:
さらに、テストでTestcontainerを使用したため、静的ポートを割り当てることができませんでした。Liquibaseでデータベースポートを構成できるようにするために、SpringLiquibaseタイプのBean名liquibaseをオーバーライドし、liquibase Bean作成メソッドでDataSource(Beanとして公開されていない)を作成し、それをliquibase Beanに設定しました。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Tomcatとspring-boot-starter

分類Dev

Oauth2およびSpring-boot-starter-parentバージョン2+を使用したSpringブートSSO

分類Dev

Spring Boot Starterアプリgraphql-spring-boot-starterを使用して2つのgraphqlエンドポイントを公開する方法はありますか?

分類Dev

Spring Boot-Spring Boot Starter Actuatorの問題

分類Dev

optaplanner-spring-boot-starterとkie-server-spring-boot-starter

分類Dev

春のinitializr:spring-boot-starter vs spring-boot-starter-web

分類Dev

spring-boot-starter-tomcatとspring-boot-starter-web

分類Dev

Spring Bootで同じ方法で2つのトランザクションでロールバックする方法

分類Dev

spring-boot-starter-data-jpaで作成されたH2データベース(spring-boot-starter-data-jdbcで作成されていない)

分類Dev

長いアイドル状態のサーバーがエラーをスローした後、MySQLを使用してspring-boot-starter-data-jpaで「トランザクション用のJPAEntityManagerを開けませんでした」

分類Dev

長いアイドル状態のサーバーがエラーをスローした後、MySQLを使用してspring-boot-starter-data-jpaで「トランザクション用のJPAEntityManagerを開けませんでした」

分類Dev

Spring Bootアプリケーションpomにspring-boot-starter-parentとspring-boot-starter-webの両方が必要なのはなぜですか?

分類Dev

適切なSpring Boot Starterの特定

分類Dev

axon-spring-boot-starterを使用したNoHandlerForCommandException

分類Dev

Spring boot starter data rest, @Notnull constraint not working

分類Dev

Spring boot starter data rest, @Notnull constraint not working

分類Dev

Why Spring Boot Starter package use obsolete logger?

分類Dev

Using Spring-Boot-Starter-Web in combination with ObjectDB

分類Dev

実際のspring-boot-starter-jta-atomikos

分類Dev

spring-boot-starter-jpaを使用したQuerydslPredicate

分類Dev

spring-boot-starter のみを含む

分類Dev

spring-boot-starter-data-jpa 0.5.0.M6から0.5.0.BUILD-SNAPSHOTにアップグレードすると、「TransactionRequiredException:トランザクションが進行中ではありません」が発生します。

分類Dev

Spring Bootの同期トランザクション

分類Dev

トランザクション内のSpring Boot LazyInitializationException

分類Dev

トランザクションを使用したSpring-boot&hibernate

分類Dev

@ManyToManyコレクションにspring-boot-starter-data-jpaが入力されていません

分類Dev

spring-boot-starter-data-jpa @ManyToManyコレクションにデータが入力されていません

分類Dev

Gradle、Spring Boot、spring-boot-starter-data-jpaアップグレード

分類Dev

依存関係のないSpringエンドポイントSpring-Boot-Data-REST-Starter

Related 関連記事

  1. 1

    Tomcatとspring-boot-starter

  2. 2

    Oauth2およびSpring-boot-starter-parentバージョン2+を使用したSpringブートSSO

  3. 3

    Spring Boot Starterアプリgraphql-spring-boot-starterを使用して2つのgraphqlエンドポイントを公開する方法はありますか?

  4. 4

    Spring Boot-Spring Boot Starter Actuatorの問題

  5. 5

    optaplanner-spring-boot-starterとkie-server-spring-boot-starter

  6. 6

    春のinitializr:spring-boot-starter vs spring-boot-starter-web

  7. 7

    spring-boot-starter-tomcatとspring-boot-starter-web

  8. 8

    Spring Bootで同じ方法で2つのトランザクションでロールバックする方法

  9. 9

    spring-boot-starter-data-jpaで作成されたH2データベース(spring-boot-starter-data-jdbcで作成されていない)

  10. 10

    長いアイドル状態のサーバーがエラーをスローした後、MySQLを使用してspring-boot-starter-data-jpaで「トランザクション用のJPAEntityManagerを開けませんでした」

  11. 11

    長いアイドル状態のサーバーがエラーをスローした後、MySQLを使用してspring-boot-starter-data-jpaで「トランザクション用のJPAEntityManagerを開けませんでした」

  12. 12

    Spring Bootアプリケーションpomにspring-boot-starter-parentとspring-boot-starter-webの両方が必要なのはなぜですか?

  13. 13

    適切なSpring Boot Starterの特定

  14. 14

    axon-spring-boot-starterを使用したNoHandlerForCommandException

  15. 15

    Spring boot starter data rest, @Notnull constraint not working

  16. 16

    Spring boot starter data rest, @Notnull constraint not working

  17. 17

    Why Spring Boot Starter package use obsolete logger?

  18. 18

    Using Spring-Boot-Starter-Web in combination with ObjectDB

  19. 19

    実際のspring-boot-starter-jta-atomikos

  20. 20

    spring-boot-starter-jpaを使用したQuerydslPredicate

  21. 21

    spring-boot-starter のみを含む

  22. 22

    spring-boot-starter-data-jpa 0.5.0.M6から0.5.0.BUILD-SNAPSHOTにアップグレードすると、「TransactionRequiredException:トランザクションが進行中ではありません」が発生します。

  23. 23

    Spring Bootの同期トランザクション

  24. 24

    トランザクション内のSpring Boot LazyInitializationException

  25. 25

    トランザクションを使用したSpring-boot&hibernate

  26. 26

    @ManyToManyコレクションにspring-boot-starter-data-jpaが入力されていません

  27. 27

    spring-boot-starter-data-jpa @ManyToManyコレクションにデータが入力されていません

  28. 28

    Gradle、Spring Boot、spring-boot-starter-data-jpaアップグレード

  29. 29

    依存関係のないSpringエンドポイントSpring-Boot-Data-REST-Starter

ホットタグ

アーカイブ