Newsletter Java: Novedades de la Semana 1 Agosto 2025
Tu newsletter semanal de Programando En Java
¡Hola programador/a! 👋
Esta semana te traigo una edición con mucho café y una pregunta que seguro te has hecho (o te han hecho) ¿Java o C#?
¡Vamos a ello!
Todo listo para que sigas subiendo de nivel en Java. ¡Vamos al lío! ☕💻
Redes Sociales
📘 Facebook: Programando en JAVA
🐦 X (Twitter): ProgEnJava
📸 Instagram: Programando en Java
💼 LinkedIn: Ricardo Romero Benítez
▶️ YouTube: Programando en Java
🎵 TikTok: Programando en Java
🧵 Threads: Programando en Java
💬 Discord: Comunidad de Programando en JAVA
🎥 Video de la Semana
👨💻 JAVA vs C#
Esta semana en el canal traigo una comparación directa entre Java y C#, dos lenguajes que dominan el desarrollo backend desde hace más de dos décadas. Pero, en 2025, ¿cuál te conviene aprender o seguir usando?
En este video corto, te explico:
Qué ventajas tiene Java con su ecosistema Spring y su enorme portabilidad
Por qué C# es tan potente, especialmente si trabajas con Microsoft, Azure o entornos Windows
Cuándo tiene sentido elegir uno u otro, según tu contexto profesional
Y, como siempre, sin fanatismos ni guerras absurdas: solo datos, contexto y una recomendación clara.
👉 Mira el video completo aquí:
📦 Novedades en Librerías y Frameworks
🧱 Spring Boot 4.0.0-M1
Primera milestone de la rama 4.x, ya disponible en Maven Central. Marca el inicio de la modularización del código, permitiendo usar @ConfigurationProperties
con tipos ubicados en módulos distintos (mediante @ConfigurationPropertiesSource
)
Ahora puedes usar
@ConfigurationProperties
con tipos en otros módulos 💥Soporte para el nuevo
JmsClient
de Spring Framework 7Deprecación del constructor
OperationMethod(Method, OperationType)
a favor de uno más robusto
🔐 Spring Security 7.0.0-M1
Incluye nuevas mejoras en la seguridad OAuth2, como BearerTokenAuthenticationConverter, y mejora el tratamiento de errores al incluir el nombre de usuario en UsernameNotFoundException, además de limpiar APIs deprecated
Nuevo
BearerTokenAuthenticationConverter
para OAuth2UsernameNotFoundException
ahora incluye el username (¡por fin!)Limpieza de elementos deprecated
🛡️ Spring Authorization Server 2.0.0-M1
Implementa OAuth 2.1 y OpenID Connect 1.0, ahora con integración de JUnit Platform Launcher (testRuntimeOnly
) y eliminación de tipos genéricos redundantes en las configuraciones Jackson
Agregado
testRuntimeOnly
para JUnit Platform LauncherLimpieza de tipos genéricos redundantes con Jackson
📊 Spring for GraphQL 2.0.0-M1
Avanza en la migración hacia anotaciones @JSpecify
y restablece el uso de serializadores de Jackson para argumentos de consulta dinámicos, mejorando la compatibilidad y eficiencia.
Migración a anotaciones
@JSpecify
Vuelven los serializadores de Jackson para argumentos dinámicos 🎯
🚀 ¿Quieres aprender Java de verdad?
Entra a codeja.dev y empieza a dominar Java desde cero hasta nivel senior, con una plataforma 100% práctica, motivadora y estructurada.
🔥 ¿Qué encontrarás?
💻 Editor Web con compilación en tiempo real
🧠 Rutas de aprendizaje de junior a senior
🏆 Retos semanales y rankings para motivarte
👥 Comunidad activa para apoyarte en cada paso
🤖 Asistente con IA que te ayuda mientras escribes código
👉 Acceso VIP solo 100 plazas disponibles — ¡reserva tu lugar y sé de los primeros en probarlo!
💾 Spring Session 4.0.0-M1
Actualizado para trabajar con Spring Framework 7.0.0‑M7 y Spring Data 2025.1.0‑M4, asegurando compatibilidad en el nuevo ecosistema de Spring.
Compatible con Spring Framework 7.0.0-M7, Spring Data 2025.1.0-M4 y más
⚙️ Spring Integration 7.0.0-M1
Da el salto a @JSpecify
y elimina dependencias con Joda-Time en ObjectMapper
, modernizando el stack interno.
Migración inicial a
JSpecify
Adiós a Joda-Time en
ObjectMapper
(ya era hora)
🧩 Spring Modulith 2.0.0-M1
Refactoriza el ciclo de vida de eventos JDBC y mejora el encapsulamiento al reducir la visibilidad de APIs internas como ApplicationModuleSource
.
Refactor del ciclo de vida del registro de eventos JDBC
Reducción de visibilidad interna en
ApplicationModuleSource
📄 Spring REST Docs 4.0.0-M1
Añade soporte para HAL y HAL‑FORMS al extraer enlaces, y moderniza el uso de anotaciones con @JSpecify
.
Soporte para HAL y HAL-FORMS en extracción de links
Migración a anotaciones
@JSpecify
📦 Spring Batch 6.0.0-M1
Introduce el nuevo CommandLineJobOperator
como reemplazo moderno de JobRunner
, además de registrar jobs automáticamente con MapJobRegistry
.
Nuevo
CommandLineJobOperator
, reemplazo moderno delJobRunner
MapJobRegistry
ahora registra jobs automáticamente 💡
🐇 Spring AMQP 4.0.0-M3
Mejor gestión del apagado (shutdown
) del consumidor BlockingQueueConsumer
y nuevo método getStreamName()
en RabbitStreamTemplate
, útil para Streams en RabbitMQ.
Mejora en shutdown de
BlockingQueueConsumer
Nuevo
getStreamName()
enRabbitStreamTemplate
🧵 Spring for Apache Kafka 4.0.0-M3
Actualización para compatibilidad con Spring Framework 7, añade anotaciones @JSpecify
y refactoriza el StringOrBytesSerializer
usando pattern matching para un código más limpio
Anotaciones
@JSpecify
en clases de batch messagingRefactor del
StringOrBytesSerializer
con pattern matching 🤘
🚀 Spring for Apache Pulsar 2.0.0-M1
Avanza en la preparación para JSpecify
con formateo Java y Checkstyle, eliminando overrides innecesarios en el procesador de anotaciones.
Preparación para
JSpecify
usando Spring Java Format y CheckstyleEliminación de override innecesario en
AbstractPulsarAnnotationsBeanPostProcessor
🧼 Spring Web Services 5.0.0-M1
Alineado con Spring Framework 7.0.0‑M7 y Spring Security 7.0.0‑M1, incorpora @JSpecify
para mejorar la compatibilidad de tipo.
Soporte para
JSpecify
Alineado con Spring Framework 7.0.0-M7 y Spring Security 7.0.0-M1
☕ Actualizaciones del JDK
Esta semana no se han anunciado nuevas versiones del JDK. Pero recuerda que Java 22 se acerca al final de su soporte. Si estás en producción con versiones LTS anteriores, es buen momento para testear contra Java 21 o preparar la migración a Java 23 (LTS planeado para marzo 2026).
📚 Revisa: https://jdk.java.net
🧪 Nuevas JEPs o Propuestas
No se han publicado nuevas JEPs esta semana. Pero si aún no has echado un vistazo a la JEP 461: Stream Gatherers (Preview), ya estás tardando. Cambia el juego del procesamiento de streams en Java 22 🧠
🛠️ Herramientas y Utilidades para Developers
Esta semana, destacamos herramientas ya integradas en los milestone releases de Spring, como:
CommandLineJobOperator
en Spring BatchBearerTokenAuthenticationConverter
en Spring SecurityRabbitStreamTemplate#getStreamName()
en Spring AMQP
Estas no son solo “nuevas clases”, son puntos de extensión pensados para simplificar flujos complejos. Si estás construyendo pipelines, APIs seguras o consumidores de eventos, dales un vistazo detallado.
🌍 Comunidad y Ecosistema
📚 Artículo destacado:
“Migrating to Spring Boot 4: What You Should Know Before You Ship”
Un análisis técnico (y sin filtros) sobre lo que implica adoptar el milestone de Spring Boot 4.
🔗 https://spring.io/blog/2025/07/24/spring-boot-4-0-0-M1-available-now
🎥 Evento:
SpringOne Tour – Edición Virtual
Agosto 15, 2025 | Gratis y en línea
Charlas de Josh Long, Olga Maciaszek-Sharma y más.
🔗
https://springonetour.io
💡 Tip de la semana
🔥 Evita Optional.ofNullable().orElseThrow()
en cascada — usa map()
con estilo
Cuando trabajas con múltiples niveles de Optional, es común ver esto:
String username = Optional.ofNullable(user)
.map(User::getProfile)
.map(Profile::getUsername)
.orElseThrow(() -> new IllegalStateException("Username not found"));
Pero si getProfile()
o getUsername()
pueden retornar null
, corres el riesgo de una NullPointerException
dentro del map
. En su lugar, asegúrate de que cada map
trabaje sobre Optional, o encapsula los getters para garantizar ausencia de nulls.
💡 Mejor aún, define tus objetos para que nunca devuelvan
null
. Optional no es excusa para datos mal diseñados.
¿Te ha molado? Comparte esta newsletter con otro friki del backend 💻
¿Preguntas o sugerencias? Responde a este correo, y charlamos.