Platform Upgrade to Spring Boot 3.2(NEW)

Available since Release 6.0.0

Objetivos

In this version the execution engine has been upgraded from Sprring Boot 2.7 to Spring Boot 3.2, with the main objectives of:

  • Access the new features and functionalities offered by this new version of Spring Boot.

  • Resolve vulnerabilities detected in previous versions of Spring Boot and its dependencies.

The changes made in Spring Boot 3 are major, which has involved a complete revision of the Platform, among these changes we can highlight:

  • A minimum version of Java runtime 17 or later is required. In addition, Spring Framework 6.0 is required.

  • Java EE has been migrated to Jakarta EE. This implies that we have to refactor javax to jakarta in the relevant imports. In this way, Spring Boot 3 is compatible with the most recent versions of servers such as Tomcat 10.1, Jetty 11 and Undertow 2.3.

  • Hibernate 6, an object-relational mapping tool for Java, is now used.

  • Added log-based observability of metrics with Micrometer and vendors such as OpenZipkin and OpenTelemetry.

  • Native compilation is enabled, allowing much lighter and faster executables to be generated.

Significant changes in Platform

  • 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 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: ya no se extiende WebSecurityConfigurerAdapter Hay que configurar otro tipo de Beans. Muchas deprecaciones.

  • Thymeleaf: 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-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.