JxMVC
Lightning-X Framework
Framework MVC para Jakarta EE. 253 KB, cero dependencias externas y arranque en 1.2 s.
mvn install -f JxMVC.Core/pom.xml
@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);
}
}
Instálalo en segundos.
Un solo mvn install y ya tienes el framework
en tu repositorio local. Sin CDNs, sin descargas transitivas, sin sorpresas: el JAR pesa
253 KB y arrastra cero dependencias.
✓ jxmvc-core instalado
groupId jxmvc
artifact jxmvc-core
~/.m2/repository
Empieza aquí
Genera un starter en /downloads
y levántalo:
$ mvn package cargo:run
Características
Todo incluido.
Cero dependencias.
Un único JAR de 253 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.
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.
253 KB. Cero dependencias en runtime.
21 anotaciones propias, scheduler cron, pool JDBC, JSON nativo, WebSocket, métricas y OpenAPI — todo en java.* puro.
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.
@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
15 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.
$ jxmvc --trace
Rutas internas /jx/health, /jx/info, /jx/metrics, /jx/openapi. Resueltas antes de cualquier lógica de negocio.
Timer de latencia iniciado por ruta. Registra total de peticiones, errores 4xx/5xx y P95.
@JxRateLimit — ventana deslizante por IP + ruta. Retorna 429 con Retry-After si se excede.
Convención / anotaciones / plantillas {var}. Selecciona controller + acción. 405 si verbo no coincide.
@JxProfile — activa o desactiva el endpoint según entorno (dev/prod/test). 404 si no aplica.
@JxRequireAuth y @JxRequireRole. Valida sesión y rol antes de instanciar el controller.
@JxCors global o por controller. Inyecta Access-Control-* y gestiona preflight OPTIONS.
@JxFilter con fase BEFORE. Permite interceptar, modificar request o abortar con respuesta propia.
Controller instanciado. @JxInject y @JxValue resueltos del registro de servicios.
@JxBeforeAction — interceptores declarados en el controller, ejecutados antes de la acción.
@JxModelAttr — atributos comunes inyectados al modelo antes de llamar la acción.
Acción ejecutada. @JxAsync (background thread), @JxRetry (reintentos con backoff), @JxCacheable.
@JxAfterAction + filtros AFTER. Post-procesamiento, auditoría, transformación de respuesta.
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.
52 clases. 253 KB.
Todo el framework.
Sin dependencias que auditar ni versiones que conciliar: cada módulo está escrito dentro del propio JAR.
Clases contadas en jxmvc.core de la v3.4.0.
Métricas en vivo del propio sitio en el panel de observabilidad.
Endpoints del sistema
Observabilidad
incluida.
Cuatro endpoints listos desde el arranque — sin configuración, sin dependencias externas.
{
"status": "UP",
"version": "3.4.0",
"uptime": "00:04:12",
"pool": {
"active": 2,
"idle": 8,
"total": 10
},
"threads": {
"active": 4,
"virtual": true
},
"memory": {
"usedMB": 48,
"maxMB": 512
}
}
Del cero al deploy en minutos
Genera tu proyecto Lux, compílalo con Maven y despliégalo en Tomcat. Un solo JAR, sin dependencias externas.