Java EE 5

``

Contexto General

  • Backend
  • java
  • Plataforma orientada al desarrollo de aplicaciones empresariales y web distribuidas
  • Enfocada en escalabilidad, portabilidad, mantenibilidad y estandarización
  • EE5 marca un punto de consolidación y simplificación respecto a versiones anteriores
  • JAX-WS

    ¿Qué es Java EE 5?

  • Java EE 5 (Enterprise Edition) es una plataforma estándar para construir aplicaciones empresariales sobre Java
  • Introduce una programación más declarativa mediante anotaciones, reduciendo XML
  • Diseñada para ejecutarse sobre servidores de aplicaciones compatibles con el estándar
  • Base de lo que hoy evolucionó hacia Jakarta EE

Arquitectura de la Plataforma

  • Modelo multicapa:
    • Capa de presentación
    • Capa de negocio
    • Capa de persistencia
    • Capa de integración
  • Separación clara de responsabilidades
  • Comunicación entre capas mediante APIs estandarizadas

Contenedores Java EE

  • Los contenedores gestionan el ciclo de vida y servicios comunes de los componentes
  • Tipos principales:
    • Contenedor Web
    • Contenedor EJB
  • Servicios proporcionados por el contenedor:
    • Gestión de transacciones
    • Seguridad
    • Inyección de dependencias
    • Pooling de recursos
    • Concurrencia controlada

Componentes Principales

  • Componentes Web
    • Servlets
    • JSP
    • JSF
  • Componentes de Negocio
    • EJB (Session Beans, Message-Driven Beans)
  • Componentes de Persistencia
    • Entidades JPA
  • Componentes de Integración
    • Web Services
    • Mensajería (JMS)

Estándares y APIs Clave

  • JPA (Java Persistence API)
    • Mapeo objeto-relacional (ORM)
    • Abstracción sobre bases de datos relacionales
  • JAX-WS vs JAX-RS
    • Desarrollo de APIs RESTful
  • CDI (Contexts and Dependency Injection)
    • Inyección de dependencias
    • Gestión de contexto y ciclo de vida
  • JSF (JavaServer Faces)
    • Framework MVC para interfaces web
  • JSP y Servlets
    • Base del desarrollo web en Java EE
  • JMS (Java Message Service)
    • Comunicación asíncrona basada en mensajes

Especificaciones y APIs

  • Java EE se define mediante un conjunto de especificaciones formales
  • Cada especificación tiene:
    • Un contrato (API)
    • Un comportamiento esperado
  • Los proveedores implementan estas especificaciones en servidores compatibles

Servidores de Aplicaciones

  • Implementan la especificación Java EE
  • Ejemplos históricos y actuales:
    • GlassFish
    • JBoss / WildFly
    • WebLogic
    • WebSphere
  • Permiten desplegar aplicaciones portables entre proveedores

Ventajas de Java EE 5

  • Reducción significativa de configuración XML
  • Programación basada en anotaciones
  • Mayor productividad para aplicaciones empresariales
  • Ecosistema maduro y estandarizado
  • Integración nativa de múltiples tecnologías

Limitaciones y Contexto Actual

  • Curva de aprendizaje elevada
  • Infraestructura pesada comparada con enfoques modernos
  • Evolucionó hacia Jakarta EE y arquitecturas más ligeras
  • Muchas ideas influyeron directamente en frameworks como Spring

Recursos y Documentación

Java EE 5 y el Ecosistema Empresarial Java en 2025

Estado en 2025: Evolución y Relevancia

  • Java EE como especificación histórica ha sido reemplazada y evolucionada por Jakarta EE tras trasladarse a la Eclipse Foundation, con un enfoque moderno y comunitario para aplicaciones empresariales y nativas en la nube.
  • En 2025 la comunidad Java enfatiza Jakarta EE sobre Java EE tradicional, centrándose en la adopción de estándares modernos como Jakarta EE 11 y perfiles nativos cloud.
  • El informe de desarrolladores Jakarta EE 2025 muestra un crecimiento sostenido de adopción frente a otros frameworks del ecosistema Java.

¿Qué Significa Java EE 5 Hoy?

  • Java EE 5 fue una versión clave que introdujo:
  • En 2025 se considera principalmente referencia histórica y conceptual
  • Sus principios siguen vigentes en Jakarta EE y frameworks modernos

Relación con Jakarta EE

Recursos Oficiales y Documentación

Servidores de Aplicaciones y Soporte

  • Implementaciones modernas compatibles con Jakarta EE:

Formación y Aprendizaje Actualizado (2025)

Comparativas con Tecnologías y Tendencias

  • Influencia directa de:
    • Cloud native
    • Microservicios
    • Contenedores y Kubernetes
  • Comparaciones frecuentes en 2025:

Recursos Relevantes (2025)

Java EE / Jakarta EE — Conceptos Avanzados y Temas No Cubiertos (2025)

Perfiles de Plataforma

  • Jakarta EE se divide en perfiles para distintos tipos de aplicaciones
  • Permiten reducir complejidad y dependencias
  • Principales perfiles:
    • Jakarta EE Web Profile
      • Enfocado en aplicaciones web tradicionales y APIs REST
      • Incluye Servlets, JAX-RS, CDI, JPA, Bean Validation
    • Jakarta EE Core Profile
      • Pensado para microservicios y runtimes ligeros
      • Compatible con ejecución en contenedores
    • Jakarta EE Full Platform
      • Incluye todas las especificaciones empresariales

Jakarta EE y MicroProfile

  • Eclipse MicroProfile complementa Jakarta EE
  • Aporta APIs orientadas a microservicios:
    • Configuración externa
    • Health checks
    • Métricas
    • Trazabilidad distribuida
    • Tolerancia a fallos
  • Uso común:
    • Jakarta EE para el core
    • MicroProfile para capacidades cloud-native
  • Integración directa en servidores como WildFly, Payara y Open Liberty

Modelos de Despliegue Modernos

  • Evolución del despliegue tradicional EAR/WAR:
    • WAR auto-contenidos
    • Uber-JAR con runtime embebido
  • Enfoques actuales:
    • Docker + Kubernetes
    • CI/CD orientado a despliegues frecuentes
    • Infraestructura declarativa
  • Jakarta EE se adapta a:
    • Contenedores
    • Orquestadores
    • Entornos híbridos

Seguridad Empresarial

  • APIs modernas de seguridad:
    • Jakarta Security
    • Jakarta Authentication
    • Jakarta Authorization
  • Integración con:
    • OAuth2
    • OpenID Connect
    • JWT
  • Uso típico:
    • Seguridad declarativa
    • Autenticación delegada
    • Autorización basada en roles

Observabilidad y Operación

  • Conceptos clave en 2025:
    • Logging estructurado
    • Métricas
    • Trazas distribuidas
  • Integración con:
    • Prometheus
    • OpenTelemetry
    • Grafana
  • MicroProfile Metrics y Telemetry como estándar de facto

Persistencia Avanzada

  • JPA más allá del CRUD:
    • Caching de segundo nivel
    • Estrategias de fetch
    • Control de transacciones finas
  • Integración con:
    • Bases de datos relacionales
    • Bases de datos distribuidas
  • Uso combinado con:
    • CQRS
    • Event-driven architectures

Mensajería y Arquitecturas Asíncronas

  • Jakarta Messaging (JMS):
    • Comunicación desacoplada
    • Procesamiento asíncrono
  • Casos habituales:
    • Event-driven systems
    • Integración entre sistemas
    • Procesamiento en segundo plano
  • Integración con brokers modernos:
    • ActiveMQ
    • Kafka (mediante adaptadores)

Testing en el Ecosistema Jakarta EE

  • Testing más allá de unit tests:
    • Integration testing
    • Container-based testing
  • Herramientas comunes:
    • Arquillian
    • Testcontainers
    • JUnit 5
  • Beneficios:
    • Tests cercanos al entorno real
    • Validación de configuraciones y contenedores

Gobernanza y Estándares

  • Jakarta EE es gobernado por:
    • Eclipse Foundation
    • Working Groups abiertos
  • Ventajas del modelo:
    • Transparencia
    • Evolución independiente del JDK
    • Participación de múltiples vendors
  • Diferencia clave frente a frameworks propietarios

Casos de Uso Reales en 2025

  • Sistemas legacy modernizados
  • Backends empresariales de larga vida
  • APIs REST estables y estandarizadas
  • Plataformas que requieren:
    • Portabilidad
    • Longevidad
    • Vendor lock-in mínimo

Relación con Frameworks Modernos

  • Jakarta EE no compite directamente con:
    • Spring Boot
    • Quarkus
  • Se complementa según el contexto:
    • Jakarta EE: estándares y portabilidad
    • Frameworks: productividad y abstracción
  • Decisión basada en:
    • Tamaño del equipo
    • Requisitos de mantenimiento
    • Ciclo de vida del proyecto

Futuro del Ecosistema

  • Tendencias claras:
    • Menos XML, más código declarativo
    • Perfiles más pequeños
    • Mejor integración cloud-native
  • Jakarta EE se posiciona como:
    • Base estable y estandarizada
    • Alternativa a soluciones propietarias
    • Plataforma de largo plazo para empresas

Jakarta EE / Java EE — Guía Práctica con Casos de Uso y Ejemplos de Código

Caso de Uso: API REST Empresarial

  • Exposición de servicios backend estables
  • Uso típico en:
    • Frontends web
    • Apps móviles
    • Integraciones entre sistemas

Ejemplo JAX-RS — Recurso REST

@Path("/clientes")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class ClienteResource {

	@Inject
	private ClienteService service;

	@GET
	public List<Cliente> listar() {
		return service.obtenerTodos();
	}

	@POST
	public Response crear(Cliente cliente) {
		service.guardar(cliente);
		return Response.status(Response.Status.CREATED).build();
	}
}

`

Caso de Uso: Lógica de Negocio Transaccional

  • Encapsulación de reglas de negocio
  • Manejo automático de transacciones
  • Ideal para procesos críticos

Ejemplo EJB — Servicio de Negocio

@Stateless
public class ClienteService {

	@PersistenceContext
	private EntityManager em;

	public List<Cliente> obtenerTodos() {
		return em.createQuery("SELECT c FROM Cliente c", Cliente.class)
			.getResultList();
	}

	public void guardar(Cliente cliente) {
		em.persist(cliente);
	}
}

Caso de Uso: Persistencia con JPA

  • Abstracción de base de datos
  • Portabilidad entre proveedores
  • Modelo orientado a entidades

Ejemplo JPA — Entidad

@Entity
@Table(name = "clientes")
public class Cliente {

	@Id
	@GeneratedValue
	private Long id;

	private String nombre;
	private String email;

	// getters y setters
}

Caso de Uso: Inyección de Dependencias

  • Desacoplar componentes
  • Facilitar testing y mantenimiento
  • Gestión automática del ciclo de vida

Ejemplo CDI — Bean Inyectable

@ApplicationScoped
public class EmailService {

	public void enviar(String destino, String mensaje) {
		System.out.println("Enviando email a " + destino);
	}
}

Caso de Uso: Integración de Servicios

  • Comunicación entre sistemas
  • Procesos desacoplados
  • Arquitecturas orientadas a eventos

Ejemplo JMS — Productor de Mensajes

@Stateless
public class NotificacionProducer {

	@Resource(lookup = "jms/Queue")
	private Queue queue;

	@Resource
	private JMSContext context;

	public void enviar(String mensaje) {
		context.createProducer().send(queue, mensaje);
	}
}

Caso de Uso: Procesamiento Asíncrono

  • Tareas de larga duración
  • Evitar bloqueos en peticiones HTTP
  • Escalabilidad

Ejemplo EJB — Método Asíncrono

@Stateless
public class ReporteService {

	@Asynchronous
	public void generarReporte() {
		// lógica pesada
	}
}

Caso de Uso: Seguridad Declarativa

  • Control de acceso basado en roles
  • Menos código imperativo
  • Integración con proveedores externos

Ejemplo Jakarta Security

@RolesAllowed("ADMIN")
@GET
@Path("/admin")
public Response zonaAdmin() {
	return Response.ok("Acceso concedido").build();
}

Caso de Uso: Validación de Datos

  • Validaciones automáticas
  • Reglas declarativas
  • Menos lógica manual

Ejemplo Bean Validation

public class UsuarioDTO {

	@NotNull
	@Email
	private String email;

	@Size(min = 8)
	private String password;
}

Caso de Uso: Aplicación Web Tradicional

  • Backoffice
  • Sistemas internos
  • Formularios y flujos complejos

Ejemplo JSF — Managed Bean

@Named
@RequestScoped
public class ClienteBean {

	private Cliente cliente = new Cliente();

	public void guardar() {
		// persistir cliente
	}

	public Cliente getCliente() {
		return cliente;
	}
}

Caso de Uso: Configuración Externa (MicroProfile)

  • Separar configuración del código
  • Adaptación por entorno
  • Cloud-native

Ejemplo MicroProfile Config

@ApplicationScoped
public class ConfigService {

	@Inject
	@ConfigProperty(name = "app.nombre")
	String nombreApp;

	public String obtenerNombre() {
		return nombreApp;
	}
}

Caso de Uso: Observabilidad

  • Monitoreo en producción
  • Métricas y salud del sistema
  • Diagnóstico rápido

Ejemplo MicroProfile Health

@Readiness
@ApplicationScoped
public class HealthCheckServicio implements HealthCheck {

	@Override
	public HealthCheckResponse call() {
		return HealthCheckResponse.up("servicio-activo");
	}
}

Caso de Uso: Testing de Integración

  • Validar comportamiento real
  • Entorno cercano a producción
  • Detectar errores de configuración

Ejemplo Testcontainers + JUnit

@Testcontainers
public class ClienteIT {

	@Container
	static PostgreSQLContainer<?> db =
		new PostgreSQLContainer<>("postgres:15");

	@Test
	void contextoArranca() {
		assertTrue(db.isRunning());
	}
}

Caso de Uso: Despliegue Empresarial

  • Aplicaciones de larga vida
  • Portabilidad entre servidores
  • Control operacional

Ejemplo Estructura WAR

app.war
├─ WEB-INF
│  ├─ web.xml
│  └─ beans.xml
├─ index.xhtml
└─ resources

JAX-RS vs JAX-WS

Visión General

  • JAX-RS y JAX-WS son especificaciones de Java EE / Jakarta EE para exponer servicios
  • Resuelven el mismo problema general (comunicación entre sistemas), pero con enfoques muy distintos
  • En 2025 su uso y relevancia son claramente diferentes

Enfoque Arquitectónico

  • JAX-RS
    • Orientado a REST
    • Basado en recursos
    • Comunicación ligera sobre HTTP
    • Usa verbos HTTP de forma semántica
  • JAX-WS
    • Orientado a SOAP
    • Basado en contratos estrictos
    • Comunicación basada en mensajes XML
    • Enfoque más formal y protocolizado

Modelo de Comunicación

  • JAX-RS
    • Resource-oriented
    • URLs representan recursos
    • Estado transferido mediante representaciones (JSON, XML)
  • JAX-WS
    • Operation-oriented
    • Métodos expuestos como operaciones remotas
    • Mensajes SOAP encapsulan la llamada

Protocolos y Formatos

  • JAX-RS
    • Protocolo principal: HTTP
    • Formatos comunes:
      • JSON
      • XML
      • Plain text
  • JAX-WS
    • Protocolo SOAP sobre:
      • HTTP
      • HTTPS
      • JMS
    • Formato:
      • XML (SOAP Envelope)

Contrato y Tipado

  • JAX-RS
    • Contrato implícito
    • Documentación mediante OpenAPI / Swagger
    • Mayor flexibilidad
  • JAX-WS
    • Contrato explícito mediante WSDL
    • Tipado fuerte y estricto
    • Generación automática de clientes y stubs

Complejidad

  • JAX-RS
    • Curva de aprendizaje baja
    • Menos configuración
    • Menor sobrecarga
  • JAX-WS
    • Curva de aprendizaje alta
    • Mayor verbosidad
    • Configuración compleja

Casos de Uso Típicos

  • JAX-RS
    • APIs REST públicas
    • Backends para frontend
    • Microservicios
    • Integraciones modernas
    • Arquitecturas cloud-native
  • JAX-WS
    • Integraciones empresariales legacy
    • Sistemas bancarios y gubernamentales
    • Entornos con contratos estrictos
    • Integraciones B2B tradicionales

Ejemplo Básico JAX-RS

Recurso REST

@Path("/pedidos")
@Produces(MediaType.APPLICATION_JSON)
public class PedidoResource {

	@GET
	public List<Pedido> listar() {
		return List.of();
	}
}

`

Ejemplo Básico JAX-WS

Servicio SOAP

@WebService
public class PedidoService {

	@WebMethod
	public List<Pedido> listarPedidos() {
		return List.of();
	}
}

Manejo de Errores

  • JAX-RS

    • Códigos HTTP estándar
    • Responses semánticas (404, 400, 500)
  • JAX-WS

    • SOAP Faults
    • Errores encapsulados en XML

Seguridad

  • JAX-RS

    • JWT
    • OAuth2
    • OpenID Connect
    • Seguridad alineada con HTTP
  • JAX-WS

    • WS-Security
    • Firmas digitales
    • Encriptación a nivel mensaje

Rendimiento y Escalabilidad

  • JAX-RS

    • Ligero
    • Mejor para alta concurrencia
    • Ideal para microservicios
  • JAX-WS

    • Mayor sobrecarga
    • Menor rendimiento relativo
    • Adecuado para integraciones críticas pero estables

Estado en 2025

  • JAX-RS

    • Estándar dominante en Jakarta EE
    • Uso activo y recomendado
    • Integrado con MicroProfile y OpenAPI
  • JAX-WS

    • Uso decreciente
    • Mayormente en sistemas legacy
    • Mantenido por compatibilidad

Cuándo Elegir Cada Uno

  • Elegir JAX-RS si:

    • Diseñas una API nueva
    • Necesitas REST y JSON
    • Buscas simplicidad y escalabilidad
  • Elegir JAX-WS si:

    • Debes integrarte con sistemas SOAP existentes
    • Requieres contratos WSDL estrictos
    • Operas en entornos enterprise legacy

Resumen Rápido

  • JAX-RS → moderno, REST, ligero, flexible
  • JAX-WS → formal, SOAP, robusto, legacy