Nuevas características

Actualización de Onesait Platform a Spring Boot 3.2

Con la release 6.0.0-Vegas de Onesait Platform, hemos actualizado el motor de ejecución de Spring Boot 2.7 a Spring Boot 3.2.

Con ello, buscamos:

  • 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 la 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.1Jetty 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 la Plataforma

  • Hibernate 6.X: «optimización» de JOINs, que puede afectar el rendimiento de la aplicación si no se tienen las relaciones a Fetch LAZY. En algunos casos de herencia de entidades, puede incluso resultar en un fallo, ya que crea consultas 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 la Plataforma para acceder a la ConfigDB a EclipseLink; esto ha obligado a cambiar consultas 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 repositories siempre y cuando no estén dentro de una función. Por ejemplo, el típico LOWER(%:param%) no va a funcionar (si funcionaria si no estuviera dentro de LOWER()). Si Queremos concatenar dentro de una consulta debemos usar la función CONCAT(param1, param2…). Un ejemplo: 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, por ejemplo 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: hay cambios importantes, como eliminación de variables request, session, etc. Deprecación de «th:include» por «th:insert», sintaxis de fragmentos, etc. 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 la 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 ha integrado las funcionalidades que faltaban: reset password, password policies, registration, etc.
  • 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. Esto se explica en la sección de Web Applications de la documentación.
  • 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.

Imagen de cabeceraGlenn Carstens-Peters en Unsplash.

✍🏻 Author(s)

Deja una respuesta