Scala + Play Framework 2.8系で、設定ファイル (application.conf
) の内容を読み込む機会があったため、メモを残します。
目次
環境
- Scala 2.13.6
- Play Framework 2.8.8
方法
Play Framework 2.8系では
- Controllerで
play.api.Configuration
やplay.api. Environment
をDIする ConfigFactory.load().getString
を使う
で行うようです。
- playframework 2.0 - Access Play! 2.0 configuration variables in application.conf? - Stack Overflow
- How to migrate - Deprecated play.Play and play.api.Play methods | Migration25 - 2.5.x
動作確認
以下の application.config・Controller・Viewを用意し、試してみます。
application.config
foo=bar
ConfigLoaderController.scala
今回は
- Controllerで play.api.Configuration をDIする
- ConfigFactory.load().getString を使う
を試してみます。
package controllers import com.typesafe.config.ConfigFactory import play.api.mvc._ import javax.inject.Inject class ConfigLoaderController @Inject()(val cc: ControllerComponents, val config: play.api.Configuration) extends AbstractController(cc) { def diConfig() = Action { implicit request: Request[AnyContent] => // injectされた config を使うパターン Ok(views.html.di_config(config.underlying.getString("foo"))) } def load() = Action { implicit request: Request[AnyContent] => // Factoryでloadする val conf = ConfigFactory.load() val value = conf.getString("foo") Ok(views.html.load_config(value)) } }
それぞれの方法用にViewを用意して、動作を確認してみます。
DI用のView (di_config.scala.html
) を
@(name: String) @main("Welcome to Play") { <h1>Configuration value: @name</h1> }
と用意したところ、値を読み込めてViewで表示できました。
一方、load用のView (load_config.scala.html
) を
@(name: String) @main("Welcome to Play") { <h1>Load value: @name</h1> }
と用意したところ、こちらも読み込めてViewで表示できました。
ソースコード
Githubに上げました。
https://github.com/thinkAmi-sandbox/play_scala_hello_app
PRはこちらです。
https://github.com/thinkAmi-sandbox/play_scala_hello_app/pull/1