Jx MVC JxMVC

JxMVC
Lightning-X Framework

Framework MVC para Jakarta EE — 224 KB, cero dependencias, arranque en 1.2 s. Pool, JSON, validación, WebSocket y OpenAPI incluidos.

224 KB

JAR

0 deps

Runtime

49 cls

Core

1.2 s

Arranque

Controller Model Config
@JxControllerMapping("api/persona")
public class PersonaController extends JxController {

    @JxGetMapping("{id}")
    public ActionResult get(@JxPathVar String id) {
        DBRow per = new PersonaModel().GetRow(
                "tblPersonas", "id = ?", id);
        if (per == null)
            return Json(GenApi.Error(404, "No encontrado"));

        return Json(GenApi.JsonStr(
            "id",     per.Get("id"),
            "nombre", per.GetString("Nombres"),
            "correo", per.GetString("Correo")
        ));
    }

    @JxPostMapping("save")
    @JxRequireRole("admin")
    @JxRateLimit(requests = 20, windowMs = 60_000)
    public ActionResult save() {
        String nombre = model.param("nombre");
        // validar + guardar
        return Json(GenApi.Ok("Guardado")).status(201);
    }
}
$ mvn install -f JxMVC.Core/pom.xml

Características

Todo incluido.
Cero dependencias.

Un único JAR de 224 KB con todo lo que necesita una aplicación Jakarta EE real. Sin Spring, sin Hibernate, sin Jackson.

Routing inteligente

Convención de nombres + anotaciones. Plantillas {id}, args posicionales, múltiples verbos HTTP.

@JxGetMapping @JxPostMapping @JxPutMapping @JxDeleteMapping {pathVar}

Pool de conexiones

JxPool propio — keepalive, timeout, prewarm. PostgreSQL, MySQL, SQL Server.

Virtual Threads

Detectados automáticamente en Java 21+. Sin config. Máxima concurrencia sin bloqueos.

Validación declarativa

@JxRequired, @JxEmail, @JxPattern, @JxLength, @JxRange, @JxUrl, @JxFuture.

Auth + Rate Limit

@JxRequireAuth, @JxRequireRole, @JxRateLimit por IP+ruta. Ventana deslizante.

Caché en memoria

@JxCacheable y @JxCacheEvict con TTL por namespace. Sin Redis, sin Caffeine.

224 KB. Cero dependencias en runtime.

21 anotaciones propias, scheduler cron, pool JDBC, JSON nativo, WebSocket, métricas y OpenAPI — todo en java.* puro.

Sin Jackson Sin Hibernate Sin Spring Sin Guice

GenApi + JxDB

DBRow sin POJOs. JsonStr, JsonArray, JsonPaged, nested. Respuestas JSON en 1 línea.

Métricas + OpenAPI

/jx/health, /jx/metrics, /jx/openapi listos sin configuración. Latencia por ruta.

Casos de uso

Todo lo que necesitas
desde el día uno.

ApiController.java
@JxControllerMapping("api/users")
public class UserController extends JxController {

    @JxGetMapping("{id}")
    @JxRequireAuth
    public ActionResult get(@JxPathVar String id) {
        DBRow user = new UserModel().GetRow("users", "id=?", id);
        if (user == null) return Json(GenApi.Error(404, "No encontrado"));
        return Json(GenApi.JsonStr(
            "id",    id,
            "email", user.GetString("email"),
            "role",  user.GetString("role")
        ));
    }

    @JxPostMapping("")
    @JxRateLimit(requests = 10, windowMs = 60_000)
    public ActionResult create() {
        String email = model.param("email");
        String pass  = model.param("password");
        new UserModel().insert(email, pass);
        return Json(GenApi.Ok("Creado")).status(201);
    }

    @JxDeleteMapping("{id}")
    @JxRequireRole("admin")
    public ActionResult delete(@JxPathVar String id) {
        new UserModel().delete("id=?", id);
        return Json(GenApi.Ok("Eliminado"));
    }
}

Arquitectura

14 etapas por cada request

Cada petición HTTP pasa por un pipeline controlado — sin magia, predecible y trazable. Haz clic en cualquier etapa para ver el detalle.

01
Endpoints

Rutas internas /jx/health, /jx/info, /jx/metrics, /jx/openapi. Resueltas antes de cualquier lógica de negocio.

02
Métricas

Timer de latencia iniciado por ruta. Registra total de peticiones, errores 4xx/5xx y P95.

03
Rate limit

@JxRateLimit — ventana deslizante por IP + ruta. Retorna 429 con Retry-After si se excede.

04
Routing

Convención / anotaciones / plantillas {var}. Selecciona controller + acción. 405 si verbo no coincide.

05
Perfil

@JxProfile — activa o desactiva el endpoint según entorno (dev/prod/test). 404 si no aplica.

06
Auth

@JxRequireAuth y @JxRequireRole. Valida sesión y rol antes de instanciar el controller.

07
CORS

@JxCors global o por controller. Inyecta Access-Control-* y gestiona preflight OPTIONS.

08
Filtros

@JxFilter con fase BEFORE. Permite interceptar, modificar request o abortar con respuesta propia.

09
DI + Ctrl

Controller instanciado. @JxInject y @JxValue resueltos del registro de servicios.

10
Before

@JxBeforeAction — interceptores declarados en el controller, ejecutados antes de la acción.

11
ModelAttr

@JxModelAttr — atributos comunes inyectados al modelo antes de llamar la acción.

12
Invocación

Acción ejecutada. @JxAsync (background thread), @JxRetry (reintentos con backoff), @JxCacheable.

13
After

@JxAfterAction + filtros AFTER. Post-procesamiento, auditoría, transformación de respuesta.

14
Render

Negociación de contenido: JSP, JSON, raw, redirect. Métricas finales registradas.

Comparativa real · 5 frameworks

El más ligero.
El único con cero dependencias.

89× más pequeño que Spring Boot 0 deps en runtime 5× más rápido que Spring Boot

Endpoints del sistema

Observabilidad
incluida.

Cuatro endpoints listos desde el arranque — sin configuración, sin dependencias externas.

GET /jx/health
{
  "status": "UP",
  "version": "3.2.0",
  "uptime": "00:04:12",
  "pool": {
    "active": 2,
    "idle": 8,
    "total": 10
  },
  "threads": {
    "active": 4,
    "virtual": true
  },
  "memory": {
    "usedMB": 48,
    "maxMB": 512
  }
}