Actualización de Plataforma a Spring Boot 3.2 (NEW)

Actualización de Plataforma a Spring Boot 3.2 (NEW)

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 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.