##前置き
とあるアプリケーションの作成でKotlinを使うことにしました。で、WebのサービスAPIを作成するためのフレームワークについて、KotlinはJVM言語だからJAX-RSとか定評のあるJavaのフレームワークも使えたのでしょうけど、折角なのでKotlinのフレームワークのKtorに挑戦することにしてみました。
Webアプリケーションをtomcatなどにデプロイするにはwarファイルにすると便利なので、それについて調べたところ、公式にその方法があったりはするのですが、そこではweb.xmlをつかってKtorのサーブレットを登録する方法が示されています。
しかし今どきServlet3.0以上だと思うし、何よりxmlが煩わしいのでweb.xmlを使わないようにしてみました。
##方針
基本的な方針は単純で、web.xmlで登録するサーブレットio.ktor.server.servlet.ServletApplicationEngine
を継承したサーブレットを作成してそこにサーブレット登録用のアノテーションを付加することを考えます。
##設定項目
公式のweb.xmlで設定されているのは次の通り。
- サーブレットコンテキストへ名前
io.ktor.ktor.config
、値application.conf
- サーブレットの登録、名前は
KtorServlet
、サーブレットはio.ktor.server.servlet.ServletApplicationEngine
- async supported
- マルチパート設定
-
max-file-size
が304857600 - max-request-sizeが304857600
- file-size-thresholdが0
- サーブレットの入り口が
"/"
以上をアノテーションで設定します。
##サーブレット
上記のうち、コンテキストパラメーター以外は次のようにサーブレットで実現できます。
import io.ktor.server.servlet.ServletApplicationEngine
import javax.servlet.annotation.MultipartConfig
import javax.servlet.annotation.WebServlet
@WebServlet(name = "KtorServlet", value = ["/"], asyncSupported = true)
@MultipartConfig(fileSizeThreshold = 0, maxFileSize = 304857600, maxRequestSize = 304857600)
class KtorEntryServlet: ServletApplicationEngine() {
}
ただしサーブレットコンテキストについてはサーブレット作成前に予め設定しておく必要があるので、こちらはServletContainerInitializerを作成して設定します。コードは次の通り。
import javax.servlet.ServletContainerInitializer
import javax.servlet.ServletContext
class KtorServletContainerInitializer: ServletContainerInitializer {
override fun onStartup(c: MutableSet<Class<*>>?, ctx: ServletContext?) {
ctx!!.setInitParameter("io.ktor.ktor.config", "application.conf")
}
}
なんか安直な方法ですが、これでとりあえず動作しているみたいです(ファイルアップロードは検証していませんが)。
あと何か初期設定をしたいばあいはこちらで行えば良さそうですね。