きちんと探せばサンプルありそうな気がするんですが、こんな感じで解決しました、という一例として残しておきます。
Domaを使い始めて2年以上経ってるはずなんですが、振り返ると複数データソースは初めてでした。
daoやentityのパッケージングはどうしたものかなぁ、という課題を残しつつもとりあえず2つのデータベースを同時に扱えるようにConfigクラスやbuild.gradleを2つ準備してDoma-genまで上手く行ったのでアプリ起動!
と思ったらエラー。
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.seasar.doma.jdbc.Config] is defined: expected single matching bean but found 2: HogeDatabaseConfig,FooDatabaseConfig
まだSpringは慣れてないけど、DI候補が2つあるからDIできないぞ、と怒られているというのは何となくわかりました。
問題の箇所はDAOから生成されたクラス(XxxDaoImpl)内のコンストラクタで、ConfigをDIしようとしている部分です。
/** * @param config the config */ @org.springframework.beans.factory.annotation.Autowired() public HogeDaoImpl(org.seasar.doma.jdbc.Config config) { super(config); }
DBが一つなら型インジェクションが普通に決まるので問題無く動くのですが、 エラーメッセージにあるHogeDatabaseConfigとFooDatabaseConfigはそれぞれorg.seasar.doma.jdbc.Configを実装したクラスなので確かにこれは動かないですね。
ってことで、それぞれのConfigクラスに名前を付けて、 DAO側では@Qualifierでその名前を指定するようにしました。
その結果、自動生成部分はこのようになりました。
@org.springframework.beans.factory.annotation.Autowired() public HogeDaoImpl(@org.springframework.beans.factory.annotation.Qualifier("HogeDatabaseConfig") org.seasar.doma.jdbc.Config config) { super(config); }
これできちんと動いたので、doma-genのdao.ftlも修正しておしまい。
追記
@chonaso ConfigをDIさせる前提であれば @ Dao のconfig要素の指定はなくても大丈夫ですね
— toshihiro nakamura (@nakamura_to) 2016年6月21日
確かに!
ということで修正しました。