AICon上海|与字节、阿里、腾讯等企业共同探索Agent 时代的落地应用 了解详情
写点什么

Java 和 Kotlin 轻量级 Web 框架 Javalin 简介

  • 2019-07-26
  • 本文字数:2231 字

    阅读完需:约 7 分钟

Java 和 Kotlin 轻量级 Web 框架 Javalin 简介

Javalin 是一款 Kotlin 和 Java 轻量级 Web 框架,它设计简单,默认情况下是阻塞的,支持 WebSocket、HTTP2 和异步请求。Javalin 最初是 SparkJava 框架的一个分支,后来受 JavaScript 框架 koa.js 的影响进行了彻底的重写。


Javalin 构建于 Jetty 之上,其性能相当于原始的 Jetty。此外,开发人员不需要扩展任何类、使用 @Annotations,也不需要为 Java 或 Kotlin 下载不同版本的 Javalin。


要在 Java 中使用 Javalin,开发人员只需要一个如下所示的 public static void main  :


public static void main(String[] args) {    var app = Javalin.create().start(7000);    app.get("/", ctx -> ctx.result("Hello World"));}
复制代码


我们来看看一个带有配置信息的代码片段:


var app = Javalin.create(config -> {    config.defaultContentType = "application/json";    config.autogenerateEtags = true;    config.addStaticFiles("/public");    config.asyncRequestTimeout = 10_000L;    config.dynamicGzip = true;    config.enforceSsl = true;}).routes(() -> {    path("users", () -> {        get(UserController::getAll);        post(UserController::create);        path(":user-id"(() -> {            get(UserController::getOne);            patch(UserController::update);            delete(UserController::delete);        });        ws("events", userController::webSocketEvents);    });}).start(port);
复制代码


在 Javalin 中验证路径参数、查询参数和表单参数等都非常简单:


var myQpStr = ctx.queryParam("my-qp"); // 没有验证,返回字符串或空var myQpInt = ctx.pathParam("my-qp", Integer.class).get(); // 返回一个整数或抛出异常var myQpInt = ctx.formParam("my-qp", Integer.class).check(i -> i > 4).get(); // 整数 > 4
// 验证两个依赖的查询参数 :var fromDate = ctx.queryParam("from", Instant.class).get();var toDate = ctx.queryParam("to", Instant.class) .check(it -> it.isAfter(fromDate), "'to' has to be after 'from'") .get();
// 验证一个json消息体:var myObject = ctx.bodyValidator(MyObject.class) .check(obj -> obj.myObjectProperty == someValue) .get();
复制代码


Javalin 另一个有趣的功能是 handler。Javalin 引入了前置 handler(before-handler)、端点 handler(endpoint-handler)、后置 handler(after-handler)、异常 handler(exception-handler)和错误 handler(error-handler)。


//前置handlerapp.before(ctx -> {    // 在所有请求之前运行});app.before("/path/*", ctx -> {    // 在/path/*请求之前运行});
//端点handlerapp.get("/", ctx -> { // 一些代码 ctx.json(object);});
app.get("/hello/*, ctx -> { // 捕获所有对/hello/子路径的请求 });
//后置handlerapp.after(ctx -> { // 在所有请求之后运行});app.after("/path/*", ctx -> { // 在/path/*请求之后运行 });
复制代码


为了处理验证/授权,Javalin 引入了功能性接口 AccessManager,程序开发人员可以根据需要实现自己的访问管理。


// 设置Javalin应该使用的access-managerapp.accessManager((handler, ctx, permittedRoles) -> {    MyRole userRole = getUserRole(ctx);    if (permittedRoles.contains(userRole)) {        handler.handle(ctx);    } else {        ctx.status(401).result("Unauthorized");    }});
Role getUserRole(Context ctx) { // 基于请求确定用户角色 // 通常通过检查标头来完成}
enum MyRole implements Role { ANYONE, ROLE_ONE, ROLE_TWO, ROLE_THREE;}
app.routes(() -> { get("/un-secured", ctx -> ctx.result("Hello"), roles(ANYONE)); get("/secured", ctx -> ctx.result("Hello"), roles(ROLE_ONE));});
复制代码


从版本 3.0 开始,Javalin 还引入了 OpenAPI(Swagger)插件。OpenAPI 3.0 规范的完整实现提供了 DSL 和注解两种使用方式。


OpenAPI DSL:


val addUserDocs = document()        .body()        .result("400")        .result("204")
fun addUserHandler(ctx: Context) { val user = ctx.body() UserRepository.addUser(user) ctx.status(204)}
复制代码


OpenAPI 注解:


@OpenApi(    requestBody = OpenApiRequestBody(User::class),    responses = [        OpenApiResponse("400", Unit::class),        OpenApiResponse("201", Unit::class)    ])fun addUserHandler(ctx: Context) {    val user = ctx.body()    UserRepository.createUser(user)    ctx.status(201)}
复制代码


要部署 Javalin 应用程序,开发人员只需创建一个有依赖项(使用 maven-assembly-plugin)的 jar,然后用 Java -jar filename.jar 发布该 jar。Javalin 带有一个嵌入式 Jetty 服务器,所以无需额外的应用程序服务器。


Javalin 还有专门为教育工作者准备的页面,该页面强调学生可以从 Javalin 受益,因为 Javalin 提供了嵌入式的 Jetty 服务器,所以不需要 Servlet Container/Application 服务器配置就可以开始编码。


有一系列教程可供使用,如Running on GraalVMKotlin CRUD REST API。可以在教程页面找到完整的列表。


文档页面提供了有关 Javalin 的更多细节。用户可以通过 maven 或从手动maven中央库下载 Javalin。


原文链接:


Introducing Javalin: a Lightweight Web Framework for Java and Kotlin


2019-07-26 08:0012302
用户头像

发布了 199 篇内容, 共 88.3 次阅读, 收获喜欢 295 次。

关注

评论 2 条评论

发布
用户头像
用同学用javalin吗,当考虑对javalin提供的rest api进行认证鉴权保护时,是否无从下手
这里自荐一个针对restful api保护的认证鉴权框架 - sureness, 完美适配javalin 并提供了javalin使用sureness的demo
https://su.usthe.com - https://github.com/tomsun28/sureness
demo地址: https://github.com/tomsun28/sureness/tree/master/samples/javalin-sureness
非常欢迎使用和贡献!!
展开
2020-09-24 22:42
回复
用户头像
挺轻量级的
2019-07-26 09:45
回复
没有更多了
发现更多内容

深入分析mysql为什么不推荐使用uuid或者雪花id作为主键

xcbeyond

MySQL MySQL优化 3月日更

数据分析利器之Excel功能篇

小飞象@木木自由

第二届开发者社区【金码奖】,揭晓了!

京东科技开发者

开发者 开发者社区

PostgreSQL高校数据库课程改革系列活动

PostgreSQLChina

数据库 postgresql 开源 软件 开源社区

醒一醒,讲到 ZooKeeper 的选举机制了

HelloGitHub

Java zookeeper ZooKeeper原理

Redis工具收费后新的开源已出现

happlyfox

学习 工具软件 28天写作 3月日更

使用 Flink 前需要知道的 10 个『陷阱』

Apache Flink

flink

《她说》——我们自出版的第一本书

张凯峰

Python 注释

HoneyMoose

你的决定我做主——锚定效应

Justin

心理学 28天写作 游戏设计

法大大完成D轮9亿元融资,腾讯领投

人称T客

Midway Serverless 发布 2.0,一体化让前端研发再次提效

Serverless Devs

Serverless 云原生 大前端

(28DW-S8-Day19) 以太坊是什么

mtfelix

28天写作

正则表达式.06 - 断言

insight

正则表达式 3月日更

硬核干货丨借助多容器Pod,轻松扩展K8S中的应用

Rancher

“七大属性加持,三个全新升级组件”这个高性能利器有点厉害

华为云开发者联盟

数据库 数据湖 Clickhouse 华为云 集群

LeetCode题解:64. 最小路径和,动态规划,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

对象存储与HashData多云战略

酷克数据HashData

习惯

lenka

3月日更

Python 通过命令行安装包的时候 pip 提示错误

HoneyMoose

如何通过XMind 实践OKR 工作法

博文视点Broadview

Python yaml 使用的包

HoneyMoose

问题剖析之消息队列的架构设计

Kylin

读书笔记 消息队列架构 3月日更

Everything is Serverless,从开源框架对比说起

华为云开发者联盟

云计算 开源 Serverless 云原生 无服务器

夺命剪刀脚(死锁)

鲁米

方法论 死锁

四、MongoDB查询(2)

Kylin

读书笔记 分布式数据库mongodb 3月日更

有道 Kubernetes 容器API监控系统设计和实践

有道技术团队

Kubernetes 容器 分布式

makefile:带你了解一种常用于GNU gcc编译的工具语言

华为云开发者联盟

编译器 LiteOS makefile 语言 GNU

如果写文字只是自我表达「Day 19」

道伟

28天写作

历史技术栈体系即将崩溃,我们如何应对?

VoltDB

数据库 5G 边缘计算 VoltDB

马特量化交易机器人系统开发网格策略

薇電13242772558

Java 和 Kotlin 轻量级 Web 框架 Javalin 简介_语言 & 开发_Diogo Carleto_InfoQ精选文章