🎈

【Kotlin】Ktorでapplication.confを読み込む

2021/07/26に公開

概要

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