俺だけもしれないが
PlayFramework2.4 + DBFlute + Google Guice 4.0 がうまく動かない(´;ω;`)
PlayFramework2.3 はSpring を使ってできましたという事例とかは見ましたが、うまくいかなかった(´・ω・`)
DIの仕組みと、Injectの事がもう少し理解できれば絶対できるはずなんだよ(´・ω・`)
とりあえず調査報告をまとめる。マジで誰かアイディアをくれ(´;ω;`)
方法1:Play2.3とDBFluteでうまくいくのでバージョンアップしてみる
@Override
public <A> A getControllerInstance(Class<A> controllerClass) throws Exception {
A controller = INJECTOR.getInstance(controllerClass);
return controller;
}
↑このコードが2.4から使えない
これの変わりを探したが見つからなかった(´;ω;`)
調査不足かな?
方法2:GlobalSettings.javaでDI
DBFluteで書いているDIのやり方を真似してみた。
List<Module> moduleList = new ArrayList<Module>();
DataSource dataSource = DB.getDataSource();
moduleList.add(new DBFluteModule(dataSource));
Injector injector = Guice.createInjector(moduleList.toArray(new Module[]{}));
↑Bhvはnullではないが、実行時にbehaviorSelectorがnullと言われる(´;ω;`)
DIのやり方が間違っているのだろうか?
方法3:DBFluteModuleを修正
この方法が1番近かった(´・ω・`)
1,public DBFluteModule(DataSource dataSource)を削除
2,protected ImplementedInvokerAssistant createImplementedInvokerAssistant() のdataSourceをDB.getDataSource()に書き換え
3,設定ファイルにplay.modules.enabledを追加
4,GlobalSettings.javaからDBFluteのDI処理を削除
↑これで実行すると方法2のエラーは回避できるが、DataSourceがnullと言われる(´;ω;`)
DataSourceに値が入る前にDIされたのが原因。DataSourceを先に設定する必要性があるがその方法が不明(´;ω;`)
久々にDBFluteのソース追っかけたな(´・ω・`)w
けど流石にPlayFrameworkのソース追っかけるは疲れそう(´;ω;`)
Playの別のO/Rマッパーはどうやっているんだ?(;´Д`)
けど、MongoDBも使いたいんだも〜ん(´;ω;`)
DBFluteがMongoDB対応してくれたら乗り換えるんだけどなww
けどMongoを使うメリットもよくわからない(ノ∀`)アチャー
亀レスですが...
返信削除DataSourceを先に設定するのではなくて、後からDataSourceが生成されても大丈夫なようにします。
サンプルあるのでよければ参考に
https://github.com/XenonAbe/dbflute-play-guice-java-example/tree/2.4.x