🎈
【Kotlin】Ktorでapplication.confを読み込む
概要
Ktorでは、各種設定を読み込むためのファイルとして、application.conf
が用意されています。このapplication.confですが、読み込み等を行う上でちょっとハマった点があったので、今回メモ書きとして残しておきます。
前提
- Ktorのバージョンは
1.6.1
を前提とします。 - 今回application.confを配置するresourcesフォルダの場所は、プロジェクトルートとします(特に配置場所はどこでも良いのですが念のため)。
src/main/resources
に設定している記事もけっこうありますが、今回についてはドキュメントのcodeSnippetsのサンプルに合わせました。なお、場所についてはbuild.gradle
でよしなに変更できます。
対応
- おそらく最初のテンプレートのコードのままだと、
application.conf
は読み込まれないと思います。それは[kotlin] ktor で config を読みたいの記事にある通り、embeddedServer()
を呼んだだけでは、設定ファイルを読み込んでくれないためです。対応としてはこちらのドキュメントにある通り、EngineMain
を使うか、embeddedServerを使用しつつcommandLineEnvironment
で設定を取得する、といった方法が挙げられています。 -
Ktorでローカルデバッグ用に設定を切り替えるの記事にある通り、実行時の引数で読み込む設定ファイルを変更することができます。特に何も設定しなければ、resources配下の
application.conf
が読み込まれます。 - enviromentのオブジェクトから値を取得する方法は、[kotlin] ktor で config を読みたいの記事を参考ください。
設定・実装サンプル
local環境での実行を想定し、まずresources配下にapplication_local.conf
を配置します。ファイルの内容は以下の通りとし、googleのclientIdを、ソースで取得することを目指します。
ktor {
deployment {
port = 8080
port = ${?PORT}
}
application {
modules = [ com.pdfManager.ApplicationKt.module ]
}
}
google {
clientId = "googleClientId"
}
Application.kt
ではサーバの起動時に、embeddedServerを使用しつつcommandLineEnvironment
で設定を取得します。そしてApplication.moduleでenvironment
のオブジェクトを参照しControllerに渡します。
Application.kt
fun Application.module() {
install(Routing) {
userController(environment)
}
}
fun main(args: Array<String>) {
embeddedServer(
Netty,
commandLineEnvironment(args)
).start()
}
Controllerでは、渡されたenvironmentから設定値を取得します。
UserController.kt
fun Route.userController(env: ApplicationEnvironment) {
route("/user") {
post("/auth") {
System.out.println(env.config.property("google.clientId").getString())
call.respond(HttpStatusCode.OK)
}
}
}
実行時に読み込む設定ファイルを指定します。以下はIntelliJで設定する例です。
Discussion