【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

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:0011566
用户头像

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

关注

评论 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
回复
没有更多了
发现更多内容

Fabric.js 上划线、中划线(删除线)、下划线

德育处主任

JavaScript canvas FabricJS 6月月更

Tiger DAO VC产品正式上线,Seektiger生态的有力补充

EOSdreamer111

基于STM32+华为云IOT设计的云平台监控系统

DS小龙哥

6月月更

网络协议之:redis protocol详解

程序那些事

网络协议 程序那些事 6月月更

Java内存模型

卢卡多多

volatile 6月日更

openLooKeng,一款面向海量、跨DC的大数据分析利器

乌龟哥哥

6月月更

深度好文:什么是超网 Supernetting?

wljslmz

网络技术 6月月更 超网

Tiger DAO VC产品正式上线,Seektiger生态的有力补充

股市老人

一文带你学会consul 基本使用和Docker部署

迷彩

架构 Consul 服务注册与发现 微服务治理 6月月更

不到40行代码手撸一个BlocProvider

岛上码农

flutter 前端 移动端开发 安卓开发 6月月更

架构实战营毕业设计

KennyQ

gm

Prometheus 2.33.0 新特性

耳东@Erdong

release Prometheus 6月月更

快慢指针算法

工程师日月

算法 6月月更

使用‘百家饭’自动生成API调用:JS部分进展(二)

百家饭隐私计算平台创业者

js OpenAPI 代码生成

给 Angular 服务器端渲染应用设置一个渲染超时时间

Jerry Wang

typescript 前端开发 angular 前端框架 6月月更

Java中的字符串之字符串常量池

未见花闻

6月月更

基于开源IM即时通讯框架MobileIMSDK:RainbowChat v8.2版已发布

JackJiang

网络编程 即时通讯 im开发 开源im

请坚持正确佩戴口罩

IT蜗壳-Tango

6月月更

leetcode 300. Longest Increasing Subsequence 最长递增子序列 (中等)

okokabcd

动态规划 算法与数据结构 leetcoce

利用 Repository 中的方法解决实际问题

Damon

6月月更

TCP拥塞控制详解 | 1. 概述

俞凡

算法 网络 TCP拥塞控制

# 补齐短板-开源IM项目OpenIM关于初始化/登录/好友接口文档介绍

Geek_1ef48b

微博评论的高性能高可用计算架构

爱晒太阳的大白

@Query 疑难杂症

Damon

6月月更

工作一年闲记

玄兴梦影

总结 工作 自我感悟

我的第一个Vue项目-Demo

Python研究所

6月月更

微服务之consul初体验

迷彩

微服务 中间件 Consul 微服务治理 6月月更

Scala 基础 (二):变量和数据类型

百思不得小赵

scala 大数据 6月月更

Eureka注册信息配置备忘

程序员欣宸

Java Spring Cloud 6月月更

# 云原生训练营毕业总结

Neil43

云原生训练营

Nginx学习笔记总结:初次认识 Nginx

百思不得小赵

nginx 6月月更

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