---
title: "Actualización de Plataforma a Spring Boot 3.2 (NEW)"
canonical: "https://onesaitplatform-es.refined.site/space/ruta/4060938261/Actualizaci%C3%B3n%20de%20Plataforma%20a%20Spring%20Boot%203.2%20(NEW)"
format: markdown
---
> Macro (toc)

> ℹ️ Disponible desde Release 6.0.0

# Objetivos

En esta versión se ha actualizado el motor de ejecución de Sprring Boot 2.7 a Spring Boot 3.2, con los principales objetivos de:

- Acceder a las nuevas características y funcionalidades ofrecidas por esta nueva versión de Spring Boot
- Resolver vulnerabilidades detectadas en versiones anteriores, tanto de Spring Boot como de sus dependencias.

Los cambios efectuados en Spring Boot 3 son de calado, lo que ha implicado una revisión completa de Plataforma, entre estos cambios podemos destacar: 

- Se necesita una versión mínima del runtime de **Java 17 **o posterior. Además, requiere del **Spring Framework 6.0**.
- **Se ha migrado de Java EE a Jakarta EE**. Esto implica que tenemos que **refactorizar javax a jakarta** en los *imports* pertinentes. De esta manera, el Spring Boot 3 es compatible con las versiones más recientes de servidores como **Tomcat 10.1**, **Jetty 11** y **Undertow 2.3**.
- Ahora se hace uso de **Hibernate 6**, una **herramienta de mapeo objeto-relacional** para Java.
- Se añade **observabilidad** basada en registro de métricas con **Micrometer** y proveedores como **OpenZipkin** y **OpenTelemetry**.
- Se permite la **compilación nativa**, permitiendo generar ejecutables mucho más ligeros y rápidos.

# Cambios reseñables en Plataforma

- **Hibernate 6.X** : “optimización” de JOINs, puede afectar el rendimiento de la aplicación si no se tienen las relaciones a Fetch LAZY. [https://docs.jboss.org/hibernate/orm/6.0/migration-guide/migration-guide.html](https://docs.jboss.org/hibernate/orm/6.0/migration-guide/migration-guide.html) En algunos casos de herencia de entidades, puede incluso resultar en un fallo, ya que crea queries de 165 joins y por ejemplo MariaDB permite máximo 61.
- **Migración a EclipseLink 4.0: **por el motivo anterior se ha migrado el motor de persistencia de plataforma para acceder a la ConfigDB a EclipseLink., esto ha obligado a cambiar queries que se hacían relativas a OPResource y ProjectResourceAccess.
- **EclipseLink L2 cache**: por defecto se activa una caché que a priori deshabilitaremos si ya tenemos un gestor de cache a nivel de repositorio, para evitar inconsistencias: properties.put("eclipselink.cache.shared.default", "false");
- **Concatenación de metacaracteres en Queries.** Es posible concatenar caracteres en los @Query de los repositorys siempre y cuando no estén dentro de una función Pej: el típico LOWER(%:param%) no va a funcionar (si funcionaria si no estuviera dentro de LOWER()). Si Queremos concatenar dentro de una Query debemos usar la función CONCAT(param1, param2…). Pej: el típico LOWER(%:param%) debe ponerse como CONCAT('%', :param, '%')
- **Queries nativas: **en EclipseLink hay que utilizar una sintaxis diferente para las queries nativas, no se pueden utilizar named parameters, hay que utilizar '?' y el número de arguemento.
- **AspectJ: ** en las expresiones de los pointcuts que contienen args() no es capaz de mapear argumentos  si tienen declarada más de una variable, p.e. args(ontology, user,…) → String ontology, String user, en runtime nos dirá que es ambiguo y no se pueden mapear los args a los argumentos del método, hay que usar reflection para sacarlo a través del JoinPoint.
- **Repositories: **en las queries que se quieran comparar Enums con literales, ya no se puede, hay que utilizar el fully qualified class name: com.example.EnumT.Type.QUERY
- **Seguridad de Spring cambia radicalmente: y**a no se extiende `WebSecurityConfigurerAdapter` Hay que configurar otro tipo de Beans. Muchas deprecaciones.
- **Thymeleaf: **[https://www.thymeleaf.org/doc/articles/thymeleaf31whatsnew.html](https://www.thymeleaf.org/doc/articles/thymeleaf31whatsnew.html)  Cambios importantes como eliminación de variables request, session…Deprecación de th:include por th:insert, sintaxis de fragmentos…Aparece en los logs del controlpanel como WARN
- **Formularios multipart: **ha cambiado la configuración que teníamos y ahora es genérica, por eso es importante que si se crean nuevos formularios multipart, el método del controlador tendrá que ser tipo POST y POST + PUT para casos de actualización para que funcione.
- **Eliminada dependencia de Apache Calcite, **para poder levantar los módulos.
- **Eliminada la dependencia del proyecto cosmosdb,** ya que el cliente utiliza la versión 4 del http-client de apache y es incompatible.
- **Desaparece el Identity Manager básico (**también llamado OAuth2Server).  Esto se debe a que se ha dejado de dar soporte al proyecto de Spring Boot OAuth2.
- **Keycloak será usado como IM único:** se ah integrado las funcionalidades que faltaban: reset password, password policies, registration…
- **Actualización del plugin de conexión de módulos con Keycloak:** por la misma razón, se ha migrado la lógica a las nuevas librerías que ofrece Spring Security (oauth-client).
- **RestTemplate:** se puede seguir utilizando, no obstante recomiendo usar WebClient a partir de ahora, ya que en un futuro será deprecado.
- **Errores 411 al hacer una petición con RestTemplate *****customizado***** de tipo POST sin body: **en la versión 3.2 de Spring Boot, se optimizó el RestTemplate y por esta razón se dejan de mandar la cabecera Content-Lenght cuando no hay body en la request. Debido a esto podemos encontrarnos con errores 411 en la respuesta, se soluciona haciendo un wrapper con BufferingClientHttpRequestFactory. Detalle en [https://github.com/spring-projects/spring-boot/issues/38841](https://github.com/spring-projects/spring-boot/issues/38841) , [https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-6.x#web-applications](https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-6.x#web-applications) (Sección Web applications)
- En las nuevas entidades del modelo que se añadan, hay que añadir los Audit Listeners: @EntityListeners({ AuditingEntityListener.**class**, VersioningListener.**class**, AuditEntityListener.**class** }) para que complete los campos CreatedAt y UpdatedAt entre otras cosas.