Spring Boot

Migración y evolución hacia Spring Boot

Evolución de aplicaciones Java existentes hacia Spring Boot para facilitar el desarrollo de servicios, APIs y nuevas funcionalidades backend.

Pedir diagnóstico gratuito

El reto

No todas las aplicaciones necesitan una migración completa

La evolución hacia Spring Boot puede abordarse de distintas formas dependiendo de la arquitectura existente, las dependencias, el servidor de aplicaciones y las necesidades del proyecto. Antes de decidir una estrategia conviene analizar el punto de partida.

En bastantes casos la opción razonable no es migrar el monolito entero, sino levantar los servicios nuevos en Spring Boot y desplazar funcionalidad poco a poco, manteniendo las dos partes en producción mientras dure la transición.

Qué se analiza

Qué se mira antes de mover la aplicación a Spring Boot

  • Análisis de aplicaciones Java existentes
  • Evaluación de viabilidad de la migración
  • Migración progresiva de funcionalidades
  • Desarrollo de nuevos servicios con Spring Boot
  • Evolución de APIs existentes
  • Refactorización de componentes backend
  • Integración con bases de datos
  • Separación progresiva de funcionalidades

Tecnologías relacionadas

Versiones y piezas implicadas en el salto

  • Java
  • Spring
  • Spring Boot
  • Spring MVC
  • Spring Data
  • Hibernate
  • REST
  • Maven
  • Git

Dos migraciones que se confunden y no son la misma

Conviene separarlas desde el principio, porque tienen riesgos y calendarios muy diferentes.

Una es llevar una aplicación Java EE o Spring clásico hacia Spring Boot. Ahí el trabajo es de arquitectura: cambia cómo arranca la aplicación, cómo se configura y cómo se empaqueta. El código de negocio se toca poco.

La otra es subir de Spring Boot 2 a Spring Boot 3. Ahí el trabajo es de compatibilidad: Spring Boot 3 exige Java 17 como mínimo y arrastra el cambio de javax a jakarta en toda la aplicación. Se parece mucho más a una migración de Jakarta EE que a un cambio de framework.

La confusión sale cara cuando se planifican como si fueran una sola. Lo habitual es que una organización necesite las dos, pero en orden: primero llegar a Spring Boot 2 con la versión de Java adecuada, y después dar el salto a 3.

Qué exige cada versión de Spring Boot

Esta tabla decide el orden del trabajo: la versión de Java es un requisito previo, no una consecuencia.

Requisitos de cada generación de Spring Boot
Spring BootSpring FrameworkJava mínimoEspacio de nombres
Spring Boot 2.5 y 2.65.3Java 8javax
Spring Boot 2.75.3Java 8javax
Spring Boot 3.0 a 3.26.0 y 6.1Java 17jakarta
Spring Boot 3.3 y posteriores6.1 y posterioresJava 17jakarta

Spring Boot 2.7 es la última puerta antes del salto: es el punto desde el que conviene migrar a 3, porque es donde las rutas de actualización están mejor documentadas y donde aparecen los avisos de lo que va a romperse.

Lo que cambia al pasar de Spring Boot 2 a 3

Más allá del renombrado de paquetes, hay cambios que no dan error de compilación y fallan en ejecución.

  • Propiedades de configuración renombradas: muchas claves de spring cambiaron y las antiguas dejan de leerse sin avisar.
  • Spring Security reescribió su configuración: la clase base que se extendía dejó de existir y la configuración pasa a declararse como beans.
  • Hibernate 6 sustituye a Hibernate 5, con su propio motor de consultas y su propia estrategia de nombres para tablas y columnas.
  • El soporte de trazas y métricas cambia de modelo, y la configuración anterior deja de aplicarse.
  • Las dependencias de terceros necesitan versión compatible con jakarta, no solo con Spring 6.

El más silencioso es el de la estrategia de nombres de Hibernate: si el esquema de base de datos no coincide con lo que genera la versión nueva, la aplicación arranca y falla al consultar.

Errores habituales tras la actualización

ClassNotFoundException: javax.servlet.Filter

Causa: Queda una dependencia en la variante javax dentro de un proyecto que ya corre sobre Spring 6.

Qué se hace: Buscar la transitiva culpable con mvn dependency:tree y sustituirla por su versión jakarta o excluirla si ya no hace falta.

Cannot resolve configuration property spring.redis.host

Causa: Una propiedad renombrada en Spring Boot 3. La antigua no da error: simplemente deja de aplicarse, y la aplicación arranca con el valor por defecto.

Qué se hace: Pasar por el analizador de propiedades antes de migrar y revisar el fichero de configuración entero, no solo lo que falle al arrancar.

Table not found tras migrar a Hibernate 6

Causa: Hibernate 6 cambió cómo deriva los nombres de tablas y columnas a partir de los nombres de las entidades.

Qué se hace: Fijar de forma explícita la estrategia de nombres, o declarar el nombre real con @Table y @Column en las entidades afectadas. Es preferible lo segundo: deja de depender de una convención.

No qualifying bean of type WebSecurityConfigurerAdapter

Causa: La clase desapareció en Spring Security 6 y la configuración pasa a declararse mediante beans.

Qué se hace: Reescribir la configuración de seguridad como cadena de filtros declarada por beans. Conviene hacerlo antes del salto, estando todavía en Spring Boot 2.7, donde ya está soportado.

El orden que evita tener que volver atrás

  1. Llegar a Spring Boot 2.7

    Dentro de la misma generación, sin cambiar de espacio de nombres ni de versión de Java. Es un paso barato que deja la aplicación en el mejor sitio posible para saltar.

  2. Adelantar lo que ya es compatible

    La configuración de Spring Security por beans y la sustitución de APIs marcadas como obsoletas se pueden hacer todavía en la versión 2.7. Cuanto menos quede para el salto, más fácil es aislar la causa cuando algo falle.

  3. Subir a Java 17

    Es requisito de Spring Boot 3, así que se resuelve antes y por separado. Mezclar el cambio de JDK con el de framework hace imposible saber cuál de los dos provocó cada fallo.

  4. Dar el salto a Spring Boot 3

    Renombrado de paquetes, actualización de dependencias y revisión de propiedades, en un bloque acotado y con las pruebas verdes al terminar.

  5. Revisar persistencia contra el SQL generado

    Comparar las consultas que produce Hibernate 6 con las de la versión anterior sobre los flujos críticos. Que compile y arranque no demuestra que consulte lo mismo.

Cuando lo razonable es convivir en vez de migrar

No toda aplicación necesita moverse entera. En muchos casos lo sensato es levantar los servicios nuevos en Spring Boot y dejar que convivan con la aplicación existente, decidiendo después qué se mueve y en qué orden.

Eso exige que las fronteras estén claras: quién consume qué, con qué contrato y qué pasa si una de las dos partes cambia. Es el mismo trabajo de límites que hay detrás de un diseño de APIs REST mantenible, y sin él la convivencia se convierte en dos sistemas acoplados por la base de datos.

La ventaja es que cada servicio nuevo entrega valor desde el primer día y la migración deja de ser un proyecto con fecha única. La alternativa, reescribir de golpe, es la opción más cara y la de mayor riesgo, y solo compensa cuando el sistema actual ya no se puede sostener. Cuando ese es el caso, el punto de partida es el análisis previo de la aplicación legacy.

Preguntas frecuentes

Dudas frecuentes sobre la migración a Spring Boot

¿Se puede migrar a Spring Boot 3 sin subir a Java 17?

No. Java 17 es el mínimo obligatorio de Spring Boot 3, no una recomendación. Por eso la subida de versión de Java se aborda antes y como trabajo independiente.

¿Hay que migrar toda la aplicación de golpe?

El artefacto sí, porque el espacio de nombres es uno u otro. La aplicación entendida como sistema no: es frecuente levantar servicios nuevos en Spring Boot y dejar que convivan con lo anterior mientras se decide qué se mueve.

¿Cuánto trabajo es pasar de Spring Boot 2 a 3?

El renombrado es cuestión de horas con las herramientas adecuadas. Lo que consume el tiempo son las dependencias sin versión compatible, las propiedades renombradas que fallan en silencio y la revisión de Hibernate 6. El inventario previo es el que da la cifra.

¿Hace falta ir a microservicios al migrar?

No. Un monolito modular, bien probado y desplegable es una arquitectura legítima, y para muchas aplicaciones empresariales es la correcta. Trocear un sistema que nadie entiende del todo suele multiplicar el problema en lugar de resolverlo.

¿Qué pasa con las aplicaciones en Spring clásico, sin Boot?

El camino habitual es reconstruir el arranque y la configuración sobre Spring Boot manteniendo el código de negocio, que suele necesitar pocos cambios. Lo que más trabajo da es la configuración XML heredada y las integraciones que dependían del servidor de aplicaciones.

¿Se puede hacer sin parar las entregas?

Sí, si cada fase se despliega. Llegar a la versión 2.7, adelantar lo compatible y subir Java son pasos que llegan a producción por separado. El salto final queda así acotado a un cambio pequeño y reversible.

¿Tienes este reto?

¿En qué versión de Spring estáis?

Dime la versión actual, la de Java y qué dependencias no se pueden tocar. Con eso se ve si el camino es un salto directo o dos fases.

Pedir diagnóstico gratuito

Llamada de 30 minutos, sin coste. Respondo en menos de 48 horas.

En la llamada: versión de Java, framework, servidor y qué duele hoy. Si no puedo ayudarte, te lo digo. Qué incluye el diagnóstico