playframework2.6系でアプリケーション設定(application.conf
)の取得方法が変わりました。既存のplay.Configuration
がdeprecateになり、代わりにcom.typesafe.config.Config
が推奨されています。
package play;
/**
* The current application configuration.
*
* @deprecated As of release 2.6.0. Use {@link Config} instead.
*/
@Singleton
@Deprecated
public class Configuration {
またplay.Play.application().configuration()
で取得する方法はどのクラスからも静的メソッドからも利用できて便利なのですが「テストがしづらくなる」という理由でこちらも非推奨になったので他の方法を考える必要があります。
で、どうやって取得すればいいかですが、公式の移行ガイド(英語)にはDI(@Inject)すればあっさり取得できるようなサンプルが記載されていますが、この記述では後述したケースでは設定を取得できません。(というか、サンプルコードはfinal指定しているのでコンパイルエラーになります。動くコードおいとけ!)
import com.typesafe.config.Config;
public class Foo {
private final Config config;
@javax.inject.Inject
public Foo(Config config) {
this.config = config;
}
}
ダメな例
- Controller以外のクラスで取得できない(PlayのDIはController以外ではちゃんと動作しない。たぶんGuiceのInjectの作法にしたがってbindとか自分で実装 ← 面倒すぎる)
- staticメソッドで取得できない(static変数にはInjectionできない)
対処方法を探して数時間。途中、(DIに関して)同じような痛みを抱えて悪戦苦闘した人の投稿も発見して共感したり。苦笑
java - Play 2.5.3: Using dependency injection to get configuration values - Stack Overflow
で、結論。以下でどこからでも取得できますし、staticメソッドからも利用できます。移行ガイドに書いとけ!。
private static com.typesafe.config.Config _config = com.typesafe.config.ConfigFactory.load();
余談(というか愚痴)
play frameworkの開発は続いています(最新は2.7.3
で2.8.0-RC
が進行中)が、競合のSpring boot
と比べると勝負あったという感じですね。
初期の盛り上がりが持続しなかった原因は、ドキュメントが雑で、移行(バージョンアップ)に伴う痛みが大きすぎるからでしょうか。
マイナーバージョン変わっただけで、ガラッと作法を変えてくるのはなんだかなぁという感じでした。修正の手間に加えて、検索結果にも使えない情報が大量に紛れこむ原因にもなってました。(バージョン番号でなくコードネームで管理されていたら検索はしやすいのかも?) ただでさえJavaとScalaが混在して読み替えが必要だったりだし。
とはいえ、Playの上にがっつり作り込んでしまったのであと5年くらいは付き合うことになると思います。頑張ってほしいなー。