【Javalin 】Javalin Kotlin/Java 轻量级 REST API 库

Javalin 旨在为 Kotlin 和 Java 提供一个易用的轻量级 REST API 库。这个 REST API 易于使用,API 也非常的流畅。

Javalin 主要有以下的特点:

  • 易用:不用提前学习任何概念就可以开始使用

  • 一致的 API:所有的处理程序和映射器在 Context (ctx) 中都是无效的。

  • Kotlin 和 Java 拥有几乎完全相同的 API

  • 是框架也是库:无需扩展任何功能

  • 拥有完全可定制的嵌入式服务器 (Jetty)

  • JSON 对象映射

  • 通过 AccessManager 接口简单的按端点验证

  • 简单的静态文件处理

  • 生命周期事件

  • CookieStore,一种简单的用来序列化的方法和存储在 cookie 中的对象。

  • 模板渲染

  • Markdown 渲染

下面是用 Kotlin 实现的 “Hello World” API 的例子。

import io.javalin.Javalin;public class HelloWorld {public static void main(String[] args) {var app = Javalin.create(/*config*/).get("/", ctx -> ctx.result("Hello World")).start(7070);}
}

Request Handler 每个请求处理,或者匹配某些路径处理:

app.before(ctx -> {// runs before all requests
});
app.before("/path/*", ctx -> {// runs before request to /path/*
});

请求处理:

app.get("/output", ctx -> {// some codectx.json(object);
});app.post("/input", ctx -> {// some codectx.status(201);
});

Javalin官网文档地址
下面基于Javalin和springboot、Mybatis-Flex(Mybatis-Flex官网文档)实现一个简单的项目:
项目结构:
在这里插入图片描述

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.2</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.kexuexiong</groupId><artifactId>shushan_server</artifactId><version>1.0-SNAPSHOT</version><properties><java.version>17</java.version><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>com.mybatis-flex</groupId><artifactId>mybatis-flex-spring-boot-starter</artifactId><version>1.5.3</version></dependency><dependency><groupId>com.mybatis-flex</groupId><artifactId>mybatis-flex-processor</artifactId><version>1.5.3</version><scope>provided</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.20</version><scope>runtime</scope></dependency><dependency><groupId>io.javalin</groupId><artifactId>javalin</artifactId><version>5.6.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter-test</artifactId><version>3.0.2</version><scope>test</scope></dependency><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>4.0.3</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency><dependency><groupId>com.mybatis-flex</groupId><artifactId>mybatis-flex-codegen</artifactId><version>1.5.3</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>2.0.7</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

application.yml

spring:datasource:url: jdbc:mysql://数据库ip:3306/shushanusername: rootpassword: 密码mybatis-flex:mapper-locations:- classpath*:/mappers/*.xml

Application.java

package com.kexuexiong;import io.javalin.Javalin;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;import java.util.logging.Logger;@SpringBootApplication
@MapperScan("com.kexuexiong.mapper")
public class ShuShanApplication {private  static Logger LOGGER = Logger.getLogger(ShuShanApplication.class.getName());public static void main(String[] args) {SpringApplication.run(ShuShanApplication.class, args);}@Beanpublic Javalin init(){Javalin app = Javalin.create(/*config*/).get("/", ctx -> ctx.result("Hello World")).start(7070);return app;}
}

逆向工程工具:

package com.kexuexiong.common.utils;import com.mybatisflex.codegen.Generator;
import com.mybatisflex.codegen.config.ColumnConfig;
import com.mybatisflex.codegen.config.GlobalConfig;
import com.zaxxer.hikari.HikariDataSource;public class Codegen {public static void main(String[] args) {//配置数据源HikariDataSource dataSource = new HikariDataSource();dataSource.setJdbcUrl("jdbc:mysql://数据库ip:3306/shushan?characterEncoding=utf-8");dataSource.setUsername("root");dataSource.setPassword("密码");//创建配置内容,两种风格都可以。GlobalConfig globalConfig = createGlobalConfigUseStyle1();//GlobalConfig globalConfig = createGlobalConfigUseStyle2();//通过 datasource 和 globalConfig 创建代码生成器Generator generator = new Generator(dataSource, globalConfig);//生成代码generator.generate();}public static GlobalConfig createGlobalConfigUseStyle1() {//创建配置内容GlobalConfig globalConfig = new GlobalConfig();//设置根包globalConfig.setBasePackage("com.kexuexiong");//设置表前缀和只生成哪些表globalConfig.setGenerateSchema("shushan");globalConfig.setTablePrefix("");globalConfig.setGenerateTable("demo");//设置生成 entity 并启用 LombokglobalConfig.setEntityGenerateEnable(true);globalConfig.setEntityWithLombok(true);//设置生成 mapperglobalConfig.setMapperGenerateEnable(true);globalConfig.setAuthor("kexuexiong");globalConfig.setControllerGenerateEnable(true);globalConfig.setServiceGenerateEnable(true);globalConfig.setMapperXmlGenerateEnable(true);globalConfig.setMapperXmlPath("src/main/resources/mappers");globalConfig.setServiceImplGenerateEnable(true);//可以单独配置某个列ColumnConfig columnConfig = new ColumnConfig();columnConfig.setLarge(true);columnConfig.setVersion(true);return globalConfig;}public static GlobalConfig createGlobalConfigUseStyle2() {//创建配置内容GlobalConfig globalConfig = new GlobalConfig();//设置根包globalConfig.getPackageConfig().setBasePackage("com.kexuexiong");//设置表前缀和只生成哪些表,setGenerateTable 未配置时,生成所有表globalConfig.getStrategyConfig().setGenerateSchema("shushan").setTablePrefix("").setGenerateTable("demo");//设置生成 entity 并启用 LombokglobalConfig.enableEntity().setWithLombok(true);//设置生成 mapperglobalConfig.enableMapper();//可以单独配置某个列ColumnConfig columnConfig = new ColumnConfig();columnConfig.setColumnName("tenant_id");columnConfig.setLarge(true);columnConfig.setVersion(true);globalConfig.getStrategyConfig().setColumnConfig("account", columnConfig);return globalConfig;}
}

运行该工具类可以生成代码:
在这里插入图片描述
编写controller类:

package com.kexuexiong.controller;import cn.hutool.json.JSONUtil;
import com.kexuexiong.entity.Demo;
import com.kexuexiong.service.DemoService;
import io.javalin.Javalin;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.List;@Component
@Slf4j
public class DemoController {@Autowiredprivate Javalin app;@Autowiredprivate DemoService demoService;@PostConstructpublic void test(){app.get("/hello/{name}", ctx -> {List<Demo> list = demoService.list();log.info(JSONUtil.toJsonStr(list.toString()));ctx.result("Hello: ");});}
}

启动程序:
在这里插入图片描述
Javalin应用在一些小项目还是可以的,轻量级。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/13191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis学习

1.数据类型 Redis支持五种数据类型&#xff0c;分别是String&#xff08;字符串&#xff09;、hash&#xff08;哈希&#xff09;、list&#xff08;列表&#xff09;、set&#xff08;集合&#xff09;、zset&#xff08;有序集合&#xff09;。 1.1 String&#xff08;字符…

Android性能优化之Thread native层源码分析(InternalError/Out of memory)

近期处理Bugly上OOM问题&#xff0c;很多发生在Thread创建启动过程&#xff0c;虽然最后分析出是32位4G虚拟内存不足导致&#xff0c;但还是分析下Java层Thread 源码过程&#xff0c;可能会抛出的异常InternalError/Out of memory。 Thread报错堆栈&#xff1a; Java线程创建…

无涯教程-jQuery - serialize( )方法函数

serialize()方法将一组输入元素序列化为数据字符串。 serialize( ) - 语法 $.serialize( ) serialize( ) - 示例 假设无涯教程在serialize.php文件中具有以下PHP内容- <?php if( $_REQUEST["name"] ) {$name$_REQUEST[name];echo "Welcome ". $na…

递归:一个图教学会递归原理

递归的特点 实际上&#xff0c;递归有两个显著的特征,终止条件和自身调用: 自身调用&#xff1a;原问题可以分解为子问题&#xff0c;子问题和原问题的求解方法是一致的&#xff0c;即都是调用自身的同一个函数。终止条件&#xff1a;递归必须有一个终止的条件&#xff0c;即不…

被泼冷水后,谁能超越微服务?

历史总会重演。一切刚过去的&#xff0c;又会被重新提起。开源项目Codename One的联合创始人Shai&#xff0c;曾是Sun Microsystems开源LWUIT项目的共同作者&#xff0c;参与了无数开源项目。作为最早一批Java开发者&#xff0c;最近感慨道&#xff1a;单体&#xff0c;又回来了…

【matlab】机器人工具箱快速上手-动力学仿真(代码直接复制可用)

动力学代码&#xff0c;按需修改参数 各关节力矩-关节变量的关系曲线&#xff1a; %%%%%%%%SCARA机器人仿真模型 l[0.457 0.325]; L(1) Link(d,0,a,l(1),alpha,0,standard,qlim,[-130 130]*pi/180);%连杆1 L(2)Link(d,0,a,l(2),alpha,pi,standard,qlim,[-145 145]*pi/180);%连…

Intel RealSense D455(D400系列) Linux-ROS 安装配置(亲测可用)

硬件&#xff1a;Intel RealSense D455 系统&#xff1a;Ubuntu 18.04 Part_1: 安装librealsense SDK2.0 1.1 注册密钥 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE或者 sudo apt-key adv --keyserver hkp:/…

8.python设计模式【组合模式】

内容&#xff1a;将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。角色&#xff1a; 抽象组建&#xff08;component&#xff09;叶子组建(Leaf)复合组建(Composite)客户端 (Client) UML 图 举个例子 需求&#xf…

【初阶C语言】整数比大小

各位大佬的光临已是上上签 在C语言刷题过程中&#xff0c;一定遇到过很多比大小的题目&#xff0c;那么本节就专门介绍比大小的方法&#xff0c;若大佬们还有更优解&#xff0c;欢迎补充呀&#xff01; 本节讲解的方法主要有三种&#xff1a;1.条件判断 2.三目操作符 3.函数调…

【Linux命令200例】lsattr用于查看文件或目录的属性

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…

Windows下Nginx安装与配置教程

一、前言 1、Nginx是什么&#xff1f; Nginx是一个开源的Web服务器&#xff0c;同时Nginx也提供了反向代理和负载均衡的功能。 Nginx通常作为负载均衡器暴露在外网接受用户请求&#xff0c;同时也使用其反向代理的功能&#xff0c;将用户的请求转发到实际提供服务的内网服务器…

Power BI-云端报表定时刷新--ODBC、MySQL、Oracle等其他本地数据源的刷新(二)

ODBC数据源 一些小众的数据源无法直接连接&#xff0c;需要通过微软系统自带的应用“ODBC数据源”连接。 1.首次使用应安装对应数据库的ODBC驱动程序&#xff0c;Mysql的ODBC驱动需要手动安装 2.在web服务中进行数据源的配置 Mysql数据源 1.Powerbi与Gateway第一次连SQL…

Java工程师研学之路【002Java基础语法上】

知识体系&#xff08;Knowledge system&#xff09; 练习&#xff08;practice&#xff09; 要求&#xff1a;从控制台输入两个数字&#xff0c;然后输出两个数字的求和结果。 import java.util.Scanner; public class HelloJava {public static void sum(){System.out.print…

maven编译报错

参考链接&#xff1a;mvn打包No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK_51CTO博客_mvn打包命令 在执行 yum install -y java-1.8.0-opensdk命令后&#xff0c;使用maven去编译打包&#xff0c;结果报错&#xff0c; …

【Leetcode】62.不同路径

一、题目 1、题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? 示例1: 输入:m = 3, n = 7 输出:…

《向量数据库指南》——使用Milvus Cloud操作员安装Milvus Cloud独立版

Milvus cloud操作员HelmDocker Compose Milvus cloud Operator是一种解决方案,帮助您在目标Kubernetes(K8s)集群上部署和管理完整的Milvus cloud服务堆栈。该堆栈包含所有Milvus cloud组件和相关依赖项,如etcd、Pulsar和MinIO。本主题介绍如何使用Milvus cloud Operator安…

文心一言 VS 讯飞星火 VS chatgpt (67)-- 算法导论6.5 6题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;67&#xff09;-- 算法导论6.5 6题 六、在 HEAP-INCREASE-KEY 的第 5 行的交换操作中&#xff0c;一般需要通过三次赋值来完成。想一想如何利用INSERTION-SORT 内循环部分的思想&#xff0c;只用一次赋值就完成这一交换操作? 文…

STUN工作原理

目录 一. 前言 二. STUN报文格式 STUN Header RFC3489 RFC5389 STUN Message Body RFC3489 RFC5389 三. WebRTC对STUN协议的支持 四. STUN工作流程 1. 使用STUN获取NAT映射后的地址 五. 参考资料 一. 前言 现实网络环境中绝大多数主机都是处于 NAT 之后&#xff0c…

Docker 容器高级操作

Docker容器高级操作 Docker容器创建、停止、启动、删除等基础操作上篇已述,然Docker容器被广大开发者青睐,不可能只有如此简单的功能,必有高阶功法。那么接下来 让我们一同走进容器操作的高级篇,领略其高级操作的魅力。 查看容器 docker ps -a | grep tomcat [root@tudou…

Java中的代理模式

Java中的代理模式 1. 静态代理JDK动态代理CGLib动态代理 1. 静态代理 接口 public interface ICeo {void meeting(String name) throws InterruptedException; }目标类 public class Ceo implements ICeo{public void meeting(String name) throws InterruptedException {Th…