質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

1回答

6505閲覧

【Spring】複数データベースを参照すると、beanが複数存在しているというエラーが出ます

rinimaruranran

総合スコア36

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

1グッド

1クリップ

投稿2018/12/06 12:09

前提・実現したいこと

Springで一つのデータベースから情報を持ってくることは出来ているのですが、複数のデータベースを指定するとエラーが出ます。
データベースの参照は、(データベース名)Config.javaというファイル内に記述しており、@Beanもこの中で記述しています。

@Configurationというアノテーションを付与しており、これを外せば付いている方のデータベースを参照して、外した方のファイルは読み込まれないようになります。
また、エラーは実際に処理させたいタイミングではなく、アプリケーションを起動する時に発生しています。

同じアプリケーション内で複数データベースを同時に参照したいため、@Configurationをどちらにも付与している状態で処理したいです。

@ConfigurationProperties(prefix = "config.hoge")というアノテーションを付与したり、
createDtaSourceで作成されるものの名称を変えてみるといった対処をしてみたのですが、解決できませんでした。
対処法をご存知の方いらっしゃいましたら、ご教示よろしくお願いいたします。

発生している問題・エラーメッセージ

Parameter 0 of constructor in com.example.sample.repository.hoge.HogeDaoImpl required a single bean, but 2 were found: - hogeConfig: defined in file [/Users/****/sample/target/classes/com/example/sample/config/HogeConfig.class] - fugaConfig: defined in file [/Users/****/sample/target/classes/com/example/sample/config/FugaConfig.class] Action: Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

HogeConfig.class

java

1package com.example.sample.config; 2 3import javax.sql.DataSource; 4import org.seasar.doma.jdbc.Config; 5import org.seasar.doma.jdbc.JdbcLogger; 6import org.seasar.doma.jdbc.SimpleDataSource; 7import org.seasar.doma.jdbc.dialect.Dialect; 8import org.seasar.doma.jdbc.dialect.MysqlDialect; 9import org.springframework.context.annotation.Bean; 10import org.springframework.context.annotation.Configuration; 11import org.springframework.jdbc.datasource.DataSourceTransactionManager; 12import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; 13import org.springframework.transaction.PlatformTransactionManager; 14import org.springframework.transaction.annotation.EnableTransactionManagement; 15 16@Configuration 17@EnableTransactionManagement 18public class HogeConfig implements Config { 19 private DataSource dataSource = createDataSource(); 20 21 private Dialect dialect = new MysqlDialect(); 22 23 @Override 24 public DataSource getDataSource() { 25 // TODO Auto-generated method stub 26 return dataSource; 27 } 28 29 @Override 30 public Dialect getDialect() { 31 // TODO Auto-generated method stub 32 return dialect; 33 } 34 35 @Bean 36 public PlatformTransactionManager transactionManager() { 37 return new DataSourceTransactionManager(dataSource); 38 } 39 40 protected static DataSource createDataSource() { 41 SimpleDataSource dataSource = new SimpleDataSource(); 42 dataSource.setUrl("jdbc:postgresql://localhost:1234/hoge"); 43 dataSource.setUser("******"); 44 dataSource.setPassword("******"); 45 return new TransactionAwareDataSourceProxy(dataSource); 46 } 47} 48 49

FugaConfig.class

java

1package com.example.sample.config; 2 3import javax.sql.DataSource; 4import org.seasar.doma.jdbc.Config; 5import org.seasar.doma.jdbc.JdbcLogger; 6import org.seasar.doma.jdbc.SimpleDataSource; 7import org.seasar.doma.jdbc.dialect.Dialect; 8import org.seasar.doma.jdbc.dialect.MysqlDialect; 9import org.springframework.context.annotation.Bean; 10import org.springframework.context.annotation.Configuration; 11import org.springframework.jdbc.datasource.DataSourceTransactionManager; 12import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; 13import org.springframework.transaction.PlatformTransactionManager; 14import org.springframework.transaction.annotation.EnableTransactionManagement; 15 16@Configuration 17@EnableTransactionManagement 18public class FugaConfig implements Config { 19 private DataSource dataSource = createDataSource(); 20 21 private Dialect dialect = new MysqlDialect(); 22 23 @Override 24 public DataSource getDataSource() { 25 // TODO Auto-generated method stub 26 return dataSource; 27 } 28 29 @Override 30 public Dialect getDialect() { 31 // TODO Auto-generated method stub 32 return dialect; 33 } 34 35 @Bean 36 public PlatformTransactionManager transactionManager() { 37 return new DataSourceTransactionManager(dataSource); 38 } 39 40 protected static DataSource createDataSource() { 41 SimpleDataSource dataSource = new SimpleDataSource(); 42 dataSource.setUrl("jdbc:postgresql://localhost:1234/fuga"); 43 dataSource.setUser("******"); 44 dataSource.setPassword("******"); 45 return new TransactionAwareDataSourceProxy(dataSource); 46 } 47} 48 49

補足情報(FW/ツールのバージョンなど)

Spring Tool Suit 4
Postgres
Mac OS

A-pZ👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

複数のデータソースが DataSource の名前で重複してしまっているので、@Beanで名前を明示的につけてあげると解決するかと思います。

なお、よくひっかかる問題でもあるようです。
以下Qiitaを参考にしてください。

Spring Boot 1.5で複数データベースを扱うウェブアプリケーションのサンプル
SpringBootで2つのデータソースを使う(MyBatis)

投稿2018/12/06 14:02

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rinimaruranran

2018/12/07 12:32

ご回答ありがとうございます! 参考にしつつ下記のように変更してみたのですが、HogeDao.javaからHogeConfigを呼び出すと正常にhogeデータベースが呼ばれるのですが、FugaDao.javaからFugaConfigを呼び出そうとしても、@PrimaryのせいかHogeConfigが呼ばれてしまい、「FugaテーブルはHogeデータベースに存在しません」と怒られてしまいます。 おそらく@Primaryの影響でDAOで記述しているアノテーションが効いておらず、常に@PrimaryがついたConfigを参照してしまっていると思われます。 なぜDAOに記述してあるアノテーションが効いていないのか分かりますでしょうか。。 ご教示いただけると幸いです。 ============================== 【HogeDao.java】 @ConfigAutowireable @Dao(config = HogeConfig.class) @Transactional(transactionManager = "txManager1") public interface HogeDao { : } ============================== 【FugaDao.java】 @ConfigAutowireable @Dao(config = FugaConfig.class) @Transactional(transactionManager = "txManager2") public interface FugaDao { : } ============================== 【HogeConfig.class】 @Configuration @EnableTransactionManagement @Primary public class HogeConfig implements Config { @Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSourceProperties datasource2Properties() { return new DataSourceProperties(); } @Bean(name = {"datasource2"}) public DataSource datasource2( @Qualifier("datasource2Properties") DataSourceProperties properties) { return properties.initializeDataSourceBuilder().build(); } @Bean(name = {"txManager2"}) public PlatformTransactionManager txManager2(DataSource dataSource2) { return new DataSourceTransactionManager(dataSource2); } @Bean(name = {"sqlSessionFactory2"}) public SqlSessionFactory sqlSessionFactory(@Qualifier("datasource2") DataSource datasource2) throws Exception { SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean(); sqlSessionFactory.setDataSource(datasource2); return (SqlSessionFactory) sqlSessionFactory.getObject(); } private DataSource dataSource = createDataSource(); private Dialect dialect = new MysqlDialect(); @Override public DataSource getDataSource() { // TODO Auto-generated method stub return dataSource; } @Override public Dialect getDialect() { // TODO Auto-generated method stub return dialect; } @Bean public PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(dataSource); } protected static DataSource createDataSource() { SimpleDataSource dataSource = new SimpleDataSource(); dataSource.setUrl("jdbc:postgresql://localhost:1234/hoge"); dataSource.setUser("******"); dataSource.setPassword("******"); return new TransactionAwareDataSourceProxy(dataSource); } } ============================== 【FugaConfig.class】 @Configuration @EnableTransactionManagement @Primary public class FugaConfig implements Config { @Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSourceProperties datasource2Properties() { return new DataSourceProperties(); } @Bean(name = {"datasource2"}) public DataSource datasource2( @Qualifier("datasource2Properties") DataSourceProperties properties) { return properties.initializeDataSourceBuilder().build(); } @Bean(name = {"txManager2"}) public PlatformTransactionManager txManager2(DataSource dataSource2) { return new DataSourceTransactionManager(dataSource2); } @Bean(name = {"sqlSessionFactory2"}) public SqlSessionFactory sqlSessionFactory(@Qualifier("datasource2") DataSource datasource2) throws Exception { SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean(); sqlSessionFactory.setDataSource(datasource2); return (SqlSessionFactory) sqlSessionFactory.getObject(); } private DataSource dataSource = createDataSource(); private Dialect dialect = new MysqlDialect(); @Override public DataSource getDataSource() { // TODO Auto-generated method stub return dataSource; } @Override public Dialect getDialect() { // TODO Auto-generated method stub return dialect; } @Bean public PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(dataSource); } protected static DataSource createDataSource() { SimpleDataSource dataSource = new SimpleDataSource(); dataSource.setUrl("jdbc:postgresql://localhost:1234/fuga"); dataSource.setUser("******"); dataSource.setPassword("******"); return new TransactionAwareDataSourceProxy(dataSource); } }
A-pZ

2018/12/10 00:47

詳細なコードありがとうございました。内容を確認しますのでしばらくお待ちください。
rinimaruranran

2018/12/10 11:59

お手数おかけして申し訳ございません。 よろしくお願い致します。
rinimaruranran

2018/12/11 04:48

http://chonaso.hatenablog.com/entry/20160621/1466516585 こちらのサイトを参考に、Daoで@ConfigAutoWiredとしていた部分を、@AnnotateWithで書き換えることで解決することができました! 【HogeDao.java】 @AnnotateWith(annotations = { @Annotation(target = AnnotationTarget.CLASS, type = Repository.class), @Annotation(target = AnnotationTarget.CLASS, type = Component.class), @Annotation(target = AnnotationTarget.CONSTRUCTOR, type = Autowired.class), @Annotation(target = AnnotationTarget.CONSTRUCTOR_PARAMETER, type = Qualifier.class, elements = "\"HogeConfig\"") }) @Dao public interface HogeDao { : } 【DomaConfig.class】 @Configuration @EnableTransactionManagement @Primary public class HogeConfig implements Config { private DataSource dataSource = createDataSource(); private Dialect dialect = new MysqlDialect(); @Override public DataSource getDataSource() { return dataSource; } @Override public Dialect getDialect() { return dialect; } @Bean public PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(dataSource); } protected static DataSource createDataSource() { SimpleDataSource dataSource = new SimpleDataSource(); dataSource.setUrl("jdbc:postgresql://localhost:1234/hoge"); dataSource.setUser("******"); dataSource.setPassword("******"); return new TransactionAwareDataSourceProxy(dataSource); } } 【HogeConfig.class】 @Configuration @EnableTransactionManagement @Component("HogeConfig") public class HogeConfig implements Config { private DataSource dataSource = createDataSource(); private Dialect dialect = new MysqlDialect(); @Override public DataSource getDataSource() { return dataSource; } @Override public Dialect getDialect() { return dialect; } @Bean public PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(dataSource); } protected static DataSource createDataSource() { SimpleDataSource dataSource = new SimpleDataSource(); dataSource.setUrl("jdbc:postgresql://localhost:1234/hoge"); dataSource.setUser("******"); dataSource.setPassword("******"); return new TransactionAwareDataSourceProxy(dataSource); } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問