Javalin: Framework web ligero de Java y Kotlin, crea API REST en Java o Kotlin

Javalin comenzó como una bifurcación del framework de SparkJava, pero rápidamente se convirtió en una reescritura desde cero influenciada por el framework de JavaScript koa.js.

Javalin está construido sobre Jetty y su rendimiento es equivalente al código de Jetty sin procesar.

¿Qué es Javalin?

Javalin es un framework web liviano para Kotlin y Java diseñado para ser simple y bloqueador de forma predeterminada, admitiendo WebSockets, HTTP2 y solicitudes asíncronas.

Además, los desarrolladores no necesitan extender ninguna clase, usar @Annotations o incluso descargar una versión diferente de Javalin para Java y otra para Kotlin.

¿Por qué usar Javalin?

Comparar Javalin con algún otro framework de Java, como por ejemplo Spring, es como comparar una cuchilla de afeitar con una navaja suiza; pero Javalin hace lo que se supone que debe hacer.

Si deseas agregar rápidamente un punto REST final para una demostración rápida o si solo necesitas un framework web simple sin apartados adicionales como Inyecciónes de dependencias o Mapeos relacionales de objetos, considera Javalin como una opción; puesto que es fácil de aprender y más ligero a la hora de ponerlo en marcha.

Características de Javalin

Javalin ofrece una serie de muy interesantes características, que son las siguientes:

  • Simple: A diferencia de otros frameworks web Java y Kotlin, Javalin tiene muy pocos conceptos que necesita aprender. Nunca amplías las clases y rara vez implementas interfaces.
  • Ligero: Javalin ocupa solamente unas pocas miles de líneas de código sobre Jetty, y su rendimiento es equivalente al código de Jetty sin procesar. Debido a su tamaño, es muy fácil trabajar sobre el código fuente.
  • Interoperable: Otros frameworks web de Java y Kotlin suelen ofrecer versiones separadas para cada idioma. Javalin se está desarrollando teniendo en cuenta la interoperabilidad, por lo que las aplicaciones se crean de la misma manera para Java y Kotlin.
  • Flexible: Javalin está diseñado para ser simple y bloqueador, ya que este es el modelo de programación más fácil de razonar. Sin embargo, si establece un Future como resultado, Javalin cambia al modo asincrónico.
  • Educativo: Visite nuestra página de educadores si está enseñando programación web y está buscando un framework web que se salga de su camino y le permita concentrarse en los conceptos centrales de su plan de estudios.
  • Integración OpenAPI: Muchos frameworks web ligeros de Java y Kotlin no son compatibles con OpenAPI, pero Javalin tiene una integración completa, que incluye Swagger UI y redoc para mostrar los documentos generados. Obtenga más información en la página dedicada del complemento OpenAPI.

▶ Web Oficial de Javalin

Comenzando con Javalin

Para comenzar a usar Javalin con Java, los desarrolladores solo necesitan public static void main y posteriormente:

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

Veamos un fragmento con alguna configuración:

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);

Es bastante simple validar parámetros como parámetros de ruta, parámetros de consulta y parámetros de formulario en Javalin:

var myQpStr = ctx.queryParam("my-qp"); // no validation, returns String or null
var myQpInt = ctx.pathParam("my-qp", Integer.class).get(); // returns an Integer or throws
var myQpInt = ctx.formParam("my-qp", Integer.class).check(i -> i > 4).get(); // Integer > 4
// validate two dependent query parameters:
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();
// validate a json body:
var myObject = ctx.bodyValidator(MyObject.class)
.check(obj -> obj.myObjectProperty == someValue)
.get();

Otra característica interesante de Javalin que existe en otros frameworks, son los controladores. Javalin trae controladores anteriores, controladores de punto final, controladores posteriores, controladores de excepciones y controladores de errores.

//before handlers
app.before(ctx -> {
// runs before all requests
});
app.before("/path/*", ctx -> {
// runs before request to /path/*
});
//endpoint handlers
app.get("/", ctx -> {
// some code
ctx.json(object);
});
app.get("/hello/*, ctx -> {
// capture all request to sub-paths of /hello/
});
//after handlers
app.after(ctx -> {
// run after all requests
});
app.after("/path/*", ctx -> {
// runs after request to /path/*
});

Para manejar la autenticación / autorización, Javalin trae la interfaz funcional AccessManager , donde los desarrolladores pueden implementar su propio administrador de acceso como quieran.

// Set the access-manager that Javalin should use:
app.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) {
// determine user role based on request
// typically done by inspecting headers
}
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));
});

A partir de la versión 3.0, Javalin también trae un complemento OpenAPI (Swagger). La implementación completa de la especificación OpenAPI 3.0 está disponible tanto como DSL como como anotaciones.

OpenAPI DSL:

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

Anotaciones de 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)
}

Para implementar una aplicación Javalin, los desarrolladores solo necesitan crear un jar con dependencias (usando maven-assembly-plugin ), luego lanzar el jar con java -jar filename.jar .

Javalin tiene un servidor integrado Jetty, por lo que no es necesario ningún servidor de aplicaciones.

Javalin también tiene una página dedicada exclusivamente a los educadores, donde enfatizan que los estudiantes pueden beneficiarse de Javalin ya que no se requiere una configuración de Servlet Container / Application Server para comenzar a codificar, puesto que ya se incluye el servidor Jetty incorporado en Javalin.

Hay una serie de tutoriales disponibles, como Running on GraalVM y Kotlin CRUD REST API.

La lista completa se puede encontrar en la página de tutoriales.

Puede encontrar más detalles sobre Javalin en la página de documentación.

Los usuarios pueden descargar Javalin a través de Maven o manualmente desde la Central de Maven.

Relacionado

Volver a lo básico: Introducción a Tomcat

Apache Tomcat es un contenedor de servlets de Java que existe desde hace mucho tiempo. Es de código abierto e implementa las especificaciones básicas de Java Enterprise (ahora llamada Jakarta EE) como las especificaciones Jakarta Servlet, Jakarta Server Pages y Jakarta WebSocket. https://ciberninjas.com/java-sigue-siendo-popular/ Apache Software Foundation lanzó Tomcat por primera vez en 1998, solo cuatro años después de Java. https://ciberninjas.com/java-editores/ Tomcat comenzó como la implementación de ¡SEGUIR LEYENDO!

Volver a lo básico: Introducción a JDK

JRE y JDK son frecuentemente malentendidos por los más novatos. Si solo estás interesado en ejecutar aplicaciones Java en tu computadora, puedes hacerlo fácilmente con Java Runtime Environment. Sin embargo, si deseas construir un programa de software basado en Java, es posible que necesites otras herramientas denominadas JDK, además de JRE. Los desarrolladores que recién están comenzando con Java a menudo confunden el Kit de desarrollo ¡SEGUIR LEYENDO!

Tutoriales RIP: Más de 300 Guías de Programación y Tecnología basadas en Contenidos de Stack Overflow

Las guías de RIP TUTORIAL (+300) son un proyecto de ZZZ Proyects (‎una empresa dedicada a añadir valor a la comunidad .NET) que consta en la creación de libros con contenidos extraídos de Stack Overflow. Por lo que he observado, los contenidos son de 2016/17, pese a eso. Lo considero un contenido útil. Muchas guías son una simple instalación o inicio a un contenido; pero las ¡SEGUIR LEYENDO!

The best Udemy courses in August, only for 9.99 $

Los mejores cursos en inglés y en oferta, hasta el día 27. Los cursos incluidos aquí son todos en inglés. Revisa por aquí, entre los mejores cursos en oferta de Udemy de Agosto en español, si lo que deseas son cursos en español. Si por desgracia, no tienes la oportunidad de acceder a comprar alguno de los excelentes cursos que te mostraré a continuación. Siempre puedes ¡SEGUIR LEYENDO!

Si los Lenguajes de Programación fueran Superhéroes de Marvel serían..

Existen más de 750 lenguajes de programación en el universo de la programación y cada lenguaje de programación tiene un tono y un conjunto de características únicos. https://ciberninjas.com/mejores-lenguajes-programacion-2023/ No debería sorprender que este conjunto específico de características atraiga a los excéntricos, quienes ocasionalmente se reúnen para discutir entre sus diferencias, ventajas y desventajas. Consideremos un escenario fantástico donde MCU signifique "My Universo del Código" y cada ¡SEGUIR LEYENDO!