Javalin 微框架
javalin;轻量 HTTP API。
25 分钟
Javalin 微框架
不是每个服务都需要 Spring 全家桶。Javalin 几行代码就能起一个 HTTP API——基于 Jetty,API 像 Express.js,适合工具服务、Webhook 与教学 demo。本课衔接 java-core-essentials 的 Lambda,为 spring-boot-essentials 提供「裸 HTTP 之上缺了什么」的对照。
学习目标
- 用 Javalin 搭建 REST 端点并解析 JSON 请求体
- 配置中间件(before/after)做日志与异常统一处理
- 判断何时用 Javalin 替代 Spring Boot
最小 API 服务
import io.javalin.Javalin;
import io.javalin.http.Context;
public class Main {
public static void main(String[] args) {
var books = new InMemoryBookStore();
Javalin app = Javalin.create(config -> {
config.showJavalinBanner = false;
}).start(7000);
app.get("/api/books/{isbn}", ctx -> {
String isbn = ctx.pathParam("isbn");
books.find(isbn)
.ifPresentOrElse(
b -> ctx.json(b),
() -> ctx.status(404).result("not found"));
});
app.post("/api/books", ctx -> {
Book body = ctx.bodyAsClass(Book.class);
books.save(body);
ctx.status(201).json(body);
});
}
}
无需注解扫描、无 IoC 容器——依赖你自己 new 或传入。
中间件与异常处理
app.before(ctx -> log.info("{} {}", ctx.method(), ctx.path()));
app.exception(IllegalArgumentException.class, (ex, ctx) -> {
ctx.status(400).json(Map.of("error", ex.getMessage()));
});
app.exception(Exception.class, (ex, ctx) -> {
log.error("unhandled", ex);
ctx.status(500).json(Map.of("error", "internal error"));
});
对比 Spring 的 @ControllerAdvice:Javalin 在启动链上注册,更显式、更少魔法。
何时选 Javalin
| 场景 | Javalin | Spring Boot |
|---|---|---|
| 单文件 CLI 附带 HTTP 管理口 | ✅ 极佳 | 过重 |
| 需要 JPA、Security、Actuator | ❌ 需自己拼 | ✅ |
| 团队已有 Spring 规范 | 学习用 | 生产用 |
| 冷启动 < 1s 的 FaaS/边缘 | ✅ jar 小 | 启动慢 |
可与 jev-db 的 UserRepository 组合:几十行起一个用户查询 API,无需 spring-boot-starter-web。