1前書き


Javalin

は、JavaとKotlin用に書かれた軽量のWebフレームワークです。 Jetty Webサーバーの上に書かれているため、非常に高性能です。 Javalinは、http://koajs.com[koa.js]から密接にモデル化されています。つまり、理解しやすくするためにゼロから作成されています。

このチュートリアルでは、この軽量フレームワークを使用して基本的なRESTマイクロサービスを構築する手順を説明します。


2依存関係を追加する

基本的なアプリケーションを作成するために必要なのは、Javalin自体1つの依存関係だけです。

<dependency>
    <groupId>io.javalin</groupId>
    <artifactId>javalin</artifactId>
    <version>1.6.1</version>
</dependency>

現在のバージョンはhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22io.javalin%22%20AND%20a%3A%22javalin%22[here]にあります。


3 Javalinの設定

Javalinは基本的なアプリケーションの設定を簡単にします。メインクラスを定義し、単純な「Hello World」アプリケーションを設定することから始めます。


JavalinApp.java

という名前の新しいファイルを基本パッケージに作成しましょう。

このファイルの中に、mainメソッドを作成し、以下を追加して基本的なアプリケーションを設定します。

Javalin app = Javalin.create()
  .port(7000)
  .start();
app.get("/hello", ctx -> ctx.html("Hello, Javalin!"));

Javalinの新しいインスタンスを作成し、それをポート7000でリッスンさせてからアプリケーションを起動します。

また、/

hello

エンドポイントで

GET

リクエストを待機する最初のエンドポイントを設定します。

このアプリケーションを実行して、結果を確認するためにhttp://localhost:7000/helloにアクセスしてみましょう。


4

UserController


を作成する

「Hello World」の例はトピックを紹介するのに最適ですが、実際のアプリケーションには役立ちません。今度はJavalinのより現実的なユースケースを見てみましょう。

まず、作業しているオブジェクトのモデルを作成する必要があります。まずルートプロジェクトの下に

user

というパッケージを作成します。

それから、新しい

User

クラスを追加します。

public class User {
    public final int id;
    public final String name;

   //constructors
}

また、データアクセスオブジェクト(DAO)を設定する必要があります。この例では、ユーザーを格納するためにインメモリオブジェクトを使用します。


user

パッケージ内に

UserDao.java:

という新しいクラスを作成します。

class UserDao {

    private List<User> users = Arrays.asList(
      new User(0, "Steve Rogers"),
      new User(1, "Tony Stark"),
      new User(2, "Carol Danvers")
    );

    private static UserDao userDao = null;

    private UserDao() {
    }

    static UserDao instance() {
        if (userDao == null) {
            userDao = new UserDao();
        }
        return userDao;
    }

    Optional<User> getUserById(int id) {
        return users.stream()
          .filter(u -> u.id == id)
          .findAny();
    }

    Iterable<String> getAllUsernames() {
        return users.stream()
          .map(user -> user.name)
          .collect(Collectors.toList());
    }
}

このDAOをシングルトンとして実装すると、この例で使用しやすくなります。必要に応じて、メインクラスの静的メンバーとして宣言したり、Guiceなどのライブラリからの依存性注入を使用することもできます。

最後に、コントローラクラスを作成します。 Javalinを使用すると、ルートハンドラを宣言するときに非常に柔軟に対応できます。したがって、これはそれらを定義する唯一の方法です。


user

パッケージに

UserController.java

という新しいクラスを作成します。

public class UserController {
    public static Handler fetchAllUsernames = ctx -> {
        UserDao dao = UserDao.instance();
        Iterable<String> allUsers = dao.getAllUsernames();
        ctx.json(allUsers);
    };

    public static Handler fetchById = ctx -> {
        int id = Integer.parseInt(Objects.requireNonNull(ctx.param("id")));
        UserDao dao = UserDao.instance();
        User user = dao.getUserById(id);
        if (user == null) {
            ctx.html("Not Found");
        } else {
            ctx.json(user);
        }
    };
}

ハンドラを静的として宣言することで、コントローラ自体が状態を保持しないようにします。しかし、より複雑なアプリケーションでは、リクエスト間で状態を保存したい場合があります。その場合は、静的修飾子を削除する必要があります。

また、単体テストは静的メソッドでは難しいため、そのレベルのテストが必要な場合は、非静的メソッドを使用する必要があります。


5ルートを追加する

モデルからデータを取得する方法は複数あります。最後のステップは、RESTエンドポイントを介してこのデータを公開することです。メインアプリケーションに2つの新しいルートを登録する必要があります。

それらを私たちのメインアプリケーションクラスに追加しましょう。

app.get("/users", UserController.fetchAllUsernames);
app.get("/users/:id", UserController.fetchById);

アプリケーションをコンパイルして実行した後、これらの新しいエンドポイントのそれぞれに要求を出すことができます。

http://localhost:7000/usersを呼び出すと、すべてのユーザーが一覧表示され、http://localhost:7000/users/0を呼び出すと、IDが0の単一のUser

JSONオブジェクトが取得されます。データ。


6. 拡張ルート

データの取得は、ほとんどのマイクロサービスにとって極めて重要な作業です。

ただし、データストアにデータを保存できるようにする必要もあります。 Javalinはサービスを構築するために必要とされるパスハンドラのフルセットを提供します。

上記の

GET

の例を見ましたが、

__PATCH、POST、DELETE、


そして

PUT__も可能です。

また、Jacksonを依存関係として含めると、JSONリクエストボディを自動的にモデルクラスに解析できます。例えば:

app.post("/") { ctx ->
  User user = ctx.bodyAsClass(User.class);
}

リクエストボディからJSON

User

オブジェクトを取得し、それを

User

モデルオブジェクトに変換することを可能にします。


7. 結論

私達は私達のマイクロサービスを作るためにこれらの技術すべてを組み合わせることができます。

この記事では、Javalinをセットアップして簡単なアプリケーションを作成する方法を説明しました。また、クライアントが私たちのサービスと対話できるようにするための、さまざまなHTTPメソッドタイプの使用方法についても説明しました。

Javalinの使い方のより高度な例については、https://javalin.io/documentation[documentation]をチェックしてください。

また、いつものように、コードはhttps://github.com/eugenp/tutorials/tree/master/libraries[over on GitHub]で見つけることができます。