Help us understand the problem. What is going on with this article?

Ktorアプリの warをweb.xml無しで作成する。

More than 1 year has passed since last update.

前置き

とあるアプリケーションの作成で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")
    }
}

なんか安直な方法ですが、これでとりあえず動作しているみたいです(ファイルアップロードは検証していませんが)。

あと何か初期設定をしたいばあいはこちらで行えば良さそうですね。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away