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

21 Mejores Frameworks de Java

Si recién comienzas a programar con Java, puedes oje la guía para principiantes sobre Java que te guiará a través de todos los conceptos más importantes de Java que necesitas conocer, si pronto quieres comenzar a utilizar cualquier de los frameworks Java. Java es un lenguaje robusto y combinado con un framework Java, puede proporcionar las mejores soluciones para cualquier campo tecnológico, ya bien sea; un ¡SEGUIR LEYENDO!

15 Mejores Lenguajes de Programación que Aprender

Una de las habilidades más importantes para aprender en el mundo de hoy en día, es saber programar con un lenguaje de programación. En la actualidad, las computadoras han entrado en casi todas las industrias, desde el piloto automático de un avión hasta el velocímetro digital de una bicicleta pasando por la inclusión del Internet de las cosas en los pequeños electrodomésticos. Casi todo lo que ¡SEGUIR LEYENDO!

17 Nuevos Cursos Gratuitos de SQL, Python, Diseño Web y Más (06 de Marzo)

Regreso con nuevos cursos gratis, recuerda que algunos de los cupones de los cursos publicados ayer, es muy posible que aún sigan activos; y vas a poder encontrar cursos en español de javascript -typescript, react,vue- y Unity. Además, de cursos en inglés de Python, R, SQL y más; también tienes muchos cursos totalmente gratis y una gran oferta de guías para programación de O´Reilly (en inglés) ¡SEGUIR LEYENDO!

25 Mejores aplicaciones Java jamás programadas

La historia de Java comenzó en 1991, en un momento en que Sun Microsystems buscaba extender su liderazgo en el mercado de estaciones de trabajo informáticas al floreciente mercado de la electrónica personal. Poco se sabía, de que el lenguaje de programación que Sun estaba a punto de crear democratizaría la informática, inspiraría a una comunidad mundial y se convertiría en la plataforma para un ecosistema ¡SEGUIR LEYENDO!

25 Mejores cursos de Udemy 2020 [EN]

Más de 20 expertos han compilado esta lista de los mejores cursos, certificados, tutoriales, capacitación y clases de Udemy disponibles en línea para 2020. Estos incluyen las mejores ofertas y descuentos para brindarte los mejores precios en oferta. Los cursos son adecuados para principiantes, estudiantes intermedios y expertos. Esta compilación ya ha ayudado a más de 72.000 estudiantes y se actualiza cada poco tiempo. Consulta nuestra ¡SEGUIR LEYENDO!

26 Nuevos Cursos GRATIS de Udemy: Python, Javascript, Flutter (cupón finalizado)

26 Nuevos cursos con cupones free de Udemy: En español (typescript,javascript, react, vue y videojuegos) e ingles (Python, Django, Javascript, R, SQL, Flutter, Java, Qt, Bootstrap, Illustrator y Photoshop). Cursos en Español ? Curso Gratis de Udemy: Aprende JavaScript y Jquery de 0 a 100 APÚNTATE ? Curso Gratis de Udemy: Aprende Typescript de 0 a 100 APÚNTATE ? Curso Gratis de Udemy: Aprende Vue + ¡SEGUIR LEYENDO!

40 Cursos Gratis de Udemy: Desarrollo Web, Python (cupón finalizado)

Recién llega la primavera y vamos con una publicación más, que incluye los cursos del Lunes; hoy tenemos, 9 cursos en español (Typescript, Javascript, React, Vue, Firebase, Swift, Azure, HTML y CSS, Power Bi). Más 31 cursos en inglés: Javascript, Typescript, React, Python, R, Java, Drupal, Android y Kotlin, Básicos de Visual Studio Code, Bootstrap, Gitlab, Maya 3D, Photoshop, Marketing en Facebook e Instagram, SEO. Iniciación ¡SEGUIR LEYENDO!

Salir de la versión móvil