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
@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.
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.
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
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.
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.
Endpoints del sistema
Observabilidad
incluida.
Cuatro endpoints listos desde el arranque — sin configuración, sin dependencias externas.
{
"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
}
}