Object Computing, Inc.は、「Micronaut Servlet」を発表した。これは、サーバとして動作する一般的なサーブレットコンテナを実現するサーブレットAPIと一体であるMicronaut HTTPサーバを実装したMicronautプロジェクトだ。Micronaut Servletは、従来のサーブレットコンテナに慣れ親しんでいて、サーブレットのエコシステムに多大な投資をしている開発者のための代替手段を提供する。特に、これらの開発者は、一般的に3つのカテゴリのいずれかに分類される。[1] Micronautを使用したいが、ターゲットとなるデプロイメント環境はサーブレットをベースにしている人、[2] NettyベースのデフォルトのMicronaut HTTPサーバが提供するイベントループモデルよりも、サーブレットAPIのスレッド単位の接続モデルを好む人、[3] 既存のサーブレットやサーブレットフィルタを持っていて、Micronautと組み合わせたいと考えている人だ。
元々はProject Particleとして知られていたMicronautは、Java、Groovy、Kotlinで記述可能なマイクロサービスベース、クラウドネイティブ、サーバーレスアプリケーションを作成するためのフルスタックJVMベースのフレームワークだ。Micronautは2018年3月にOCIのプリンシパルソフトウェアエンジニアであり、OCIのGrailsとMicronautのプロダクトリードを務めるGraeme Rocher氏によって導入され、その後2018年5月にオープンソース化された。
MicronautのHTTP組み込みサーバでありNettyではない機能は、サポートされているサーブレットコンテナ、すなわちTomcat、Jetty、Undertowで動作する必要がある。Micronaut Servlet には、サーブレットAPI での作業を簡単にするための拡張機能がいくつか含まれる。これには、次のような機能が含まれる。従来のサーブレット API インターフェースである HTTPServletRequest
そして HttpServletResponse
をメソッドのパラメータとして受信する。サーブレットの読み書き操作を簡素化するために、Readable
そして Writable
を利用する。最後に、マルチパートフォームをサポートする。
従来のサーブレットAPI開発では、サーブレットアプリケーションのHTTPライフサイクルの振る舞いのためHTTPServletRequest
とHTTPServletResponse
インターフェースを使うことでdoGet()
, doPost()
などのメソッドをオーバーライドする必要があった。 これらのインターフェースは、ここに示すように、ユーザー定義のメソッドに渡すだろう。
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Get("/hello")
void process(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.addHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN);
response.setStatus(HttpStatus.ACCEPTED.getCode());
try (final PrintWriter writer = response.getWriter()) {
writer.append("Hello ").append(request.getParameter("name"));
writer.flush();
}
}
process()
メソッドは /hello
というREST エンドポイントを定義する@Get
アノテーションを使用する。 そして、サーバーレスポンスを構築するための2つのHTTPインターフェースに対応する。これにより、サーブレットAPIのメソッドに、より優雅な解決策を提供する。
Micronaut Servletの新しい Readable
とWritable
インターフェースは、サーブレットリクエストからの読み込みとサーブレットレスポンスへの書き込みの操作を簡単にすることを提供する。
import io.micronaut.core.io.Readable;
import io.micronaut.core.io.Writable;
@Post(value = "/writable", processes = "text/plain")
Writable readAndWrite(@Body Readable readable) throws IOException {
return out -> {
try (BufferedReader reader = new BufferedReader(readable.asReader())) {
out.append("Hello ").append(reader.readLine());
}
};
}
Micronautのアノテーション @Part
は、multipart/form-data POST
リクエストの特定の部分にバインドされていることを示すために、メソッドの引数に適用きる。次のようなメソッドを考えてみてください。
@Post(value = "/multipart", consumes = MediaType.MULTIPART_FORM_DATA, produces = "text/plain")
String multipart(
String attribute,
@Part("one") Person person,
@Part("two") String text,
@Part("three") byte[] bytes,
@Part("four") javax.servlet.http.Part raw,
@Part("five") CompletedPart part) {
return "Ok";
}
multipart()
メソッド の中で最初のattribute
パラメータは、属性に一致するパラメータ名の一覧を表している。@Part
アノテーションで装飾された残りのパラメータは、以下のように宣言されている。
- POJOにバインドされている可能性のあるコンテンツタイプ
application/json
- 型
String
- 型
byte
javax.servlet.http.Part
、サーブレットAPIインターフェースCompletedPart
は、マルチパートリクエストの完了した部分を表すMicronautのインターフェースだ。
マルチパート処理はデフォルトでは無効になっているが、構成プロパティに従って有効にできる。
GraalVMのサポートはMicronaut Servletでも利用可能だが、現時点でGraalVMを利用できるのはTomcatとJettyのみとなっている。Undertowを使用したアプリケーションは、GraalVMではコンパイルできない。
Micronaut Servletは、Micronaut AWS、Micronaut GCP、Micronaut Data、Micronaut for Spring、Micronaut Testなどの多くのMicronautプロジェクトに参加している。