ちょっとハマっちゃったので更新。
しょうも無い原因だったけど。。
バージョン: Spring Boot 2.2.0
ビルド: Gradle
JpaRepository の実装をしていたら Spring Boot が起動しなくなった。
問題
[org.springframework.data.jdbc.repository.support.JdbcRepositoryFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] for bean 'XxxRepository': There is already [Root bean: class [org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] bound. 2019-11-21 01:00:52.652 INFO 11256 --- [ restartedMain] ConditionEvaluationReportLoggingListener : Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2019-11-21 01:00:52.662 ERROR 11256 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPLICATION FAILED TO START *************************** Description: The bean 'XxxRepository', defined in null, could not be registered. A bean with that name has already been defined in null and overriding is disabled.
「Beanがかぶってるよ、Beanのかぶり許可するなら設定変えてね」という内容。
原因と解決
Spring Boot Data のライブラリ依存に問題があった。
「spring-boot-starter-data-jdbc」「spring-boot-starter-data-jpa」
これらを併用しちゃいかんということ。
それぞれのCreatorがBeanを作成しようとして重複してたのね。
言われてみればそれはそう、って感じ・・・。
JPAで実装しているので、 build.gradle でJDBCのほうを削除しました。
dependencies { // 略 // implementation 'org.springframework.boot:spring-boot-starter-data-jdbc' <-- deleted compile 'org.springframework.boot:spring-boot-starter-data-jpa' // 略 }
無事、Spring Boot が起動するようになった。
補足
この記事に行き着いてやっと解決に至った。
一般のプロジェクトでは作成時点で技術選択は済んでるだろうから、
なかなか起きないエラーなんじゃないかなぁ。
別件。
Spring Boot は起動したんだけど、JPAから発行されるMySQL 用に発行される
DDL の engine が MyISAM になっとるけど、InnoDB にしたい。。
起動引数に設定するとか、いろいろ手はありそうなのでベスト手段を模索中。
⇒ 19/11/21 単純な話だった
vemi.hatenablog.com
おわり。
#6