使用 Javalin 構建 REST 微服務

REST
Remote
0
11:22 AM · Dec 01 ,2025

1. 簡介

Javalin 是一個輕量級 Web 框架,為 Java 和 Kotlin 編寫。它基於 Jetty Web 服務器構建,因此具有高性能。Javalin 的設計緊隨 koa.js 的腳步,這意味着它從頭開始編寫,旨在易於理解和構建。

在本教程中,我們將逐步構建一個基本的 REST 微服務,使用這個輕量級框架。

2. 添加依賴項

為了創建一個基本的應用程序,我們只需要一個依賴項——Javalin 本身:

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

當前版本可以在這裏找到 這裏

3. 設置 JavalinJavalin 使得設置基本應用程序變得容易。我們首先將定義我們的主類並設置一個簡單的“Hello World”應用程序。

讓我們在我們的基本包中創建一個新文件,名為JavalinApp.java

在文件中,我們創建一個 main 方法並添加以下內容以設置基本應用程序:

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

我們正在創建一個 Javalin 實例,使其監聽端口 7000,然後啓動應用程序。

我們還設置了我們第一個端點,用於監聽 GET 請求,該請求位於 /hello 端點。

讓我們運行此應用程序並訪問 http://localhost:7000/hello 以查看結果。

4. 創建 UserController

“Hello World” 示例對於介紹主題很有用,但對於實際應用來説沒有幫助。讓我們來看一下 Javalin 的一個更實際用例。

首先,我們需要創建一個表示我們正在處理的對象模型。我們首先創建一個名為 user 的包,位於根項目下。

然後,我們添加一個新的 User 類:

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

    // constructors
}

此外,我們需要設置我們的數據訪問對象 (DAO)。在這個例子中,我們將使用一個存儲用户的數據對象。

我們創建一個名為 UserDao.java 的新類,位於 user 包中:

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 允許我們在聲明路由處理程序時具有很大的靈活性,所以這裏只是一種定義它們的途徑。

我們創建一個名為 UserController.java 的新類,位於 user 包中:

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();
        Optional<User> user = dao.getUserById(id);
        if (user.isPresent()) {
            ctx.json(user);
        } else {
            ctx.html("Not Found");
        }
    };
}

通過將處理程序聲明為靜態,我們確保控制器本身不持有狀態。但是,在更復雜的應用程序中,我們可能希望在請求之間存儲狀態,在這種情況下,我們需要刪除靜態修飾符。

請注意,靜態方法與單元測試更難,因此如果我們想要這種級別的測試,則需要使用非靜態方法。

5. 添加路由

我們現在有多種從模型中獲取數據的途徑。最後一步是使用 REST 端點公開這些數據。我們需要在主應用程序中註冊兩個新路由。

讓我們將它們添加到主應用程序類中:

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

在編譯並運行應用程序後,我們可以向這些新端點發送請求。調用 http://localhost:7000/users 將列出所有用户,調用 http://localhost:7000/users/0 將獲取 ID 為 0 的單個 User JSON 對象。我們現在擁有一個微服務,允許我們檢索 User 數據。

6. 擴展路由

檢索數據是大多數微服務的關鍵任務。

但是,我們也需要能夠將數據存儲在我們的存儲庫中。Javalin 提供所需的全部路徑處理程序,用於構建服務。

我們之前看到的一個例子是<em>GET</em>,但<em>PATCH, POST, DELETE, </em>以及<em>PUT</em>也是可行的。

此外,如果我們將 Jackson 作為依賴項包含進來,就可以自動將 JSON 請求主體解析為我們的模型類。例如:

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

這將會允許我們從請求主體中獲取 JSON<em>User</em> 對象並將其轉換為<em>User</em> 模型對象。

7. 結論

我們可以將這些技術結合起來,構建我們的微服務。

在本文中,我們看到了如何設置 Javalin 並構建一個簡單的應用程序。我們還討論瞭如何使用不同的 HTTP 方法類型,以便客户端與我們的服務進行交互。

有關如何使用 Javalin 的更高級示例,請務必查看 文檔

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.