BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Micronaut Servlet - サーブレットAPI開発者のための新しいMicronautプロジェクト

Micronaut Servlet - サーブレットAPI開発者のための新しいMicronautプロジェクト

原文(投稿日:2020/05/31)へのリンク

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ではない機能は、サポートされているサーブレットコンテナ、すなわちTomcatJettyUndertowで動作する必要がある。Micronaut Servlet には、サーブレットAPI での作業を簡単にするための拡張機能がいくつか含まれる。これには、次のような機能が含まれる。従来のサーブレット API インターフェースである HTTPServletRequestそして HttpServletResponseをメソッドのパラメータとして受信する。サーブレットの読み書き操作を簡素化するために、Readableそして Writable を利用する。最後に、マルチパートフォームをサポートする。

従来のサーブレットAPI開発では、サーブレットアプリケーションのHTTPライフサイクルの振る舞いのためHTTPServletRequestHTTPServletResponseインターフェースを使うことで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の新しい ReadableWritableインターフェースは、サーブレットリクエストからの読み込みとサーブレットレスポンスへの書き込みの操作を簡単にすることを提供する。

    
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 AWSMicronaut GCPMicronaut DataMicronaut for SpringMicronaut Testなどの多くのMicronautプロジェクトに参加している。

この記事に星をつける

おすすめ度
スタイル

BT