Accéder au contenu principal

Migration d’une application Spring Boot 2.2 vers Spring Boot 4.0 : retour d’expérience concret

 En 2019, nous avons développé une application métier basée sur :

  • Java 8
  • Spring Boot 2.2.7
  • Gradle 6.6.1
  • Thymeleaf
  • Bootstrap 4.3.1
  • Environ 40 000 lignes de code Java

Fin 2025, voici un retour d’expérience concret sur la migration vers :

  • Java 25
  • Spring Boot 4.0.1
  • Gradle 9.2.1

La partie thymeleaf, n'a pas été touché, il y a quelques warning concernant l'obsolescence de certain commande tel que th:include.

Une migration plus rapide que prévu

Un point important : en moins de 30 minutes, l’application démarrait sur la nouvelle stack.

Évidemment, "ça démarre" ne veut pas dire "tout fonctionne", mais ce premier jalon est très révélateur :

  • la base Spring Boot reste solide
  • les outils de migration sont matures
  • la dette technique était maîtrisée

Les changements majeurs rencontrés

De javax.* à jakarta.*

C’est probablement le changement le plus visible.

  • Tous les imports javax.* doivent être migrés vers jakarta.*

Impact sur :

  • JPA
  • Validation
  • Servlet API
  • Sécurité

Rien de compliqué, mais beaucoup de petites modifications réparties dans le code.

Hibernate : requêtes et comportements modifiés

C’est ici que se trouvent les changements les plus subtils.

Le QueryHint hint_pass_distinct_through ne fonctionne plus

Certaines optimisations Hibernate basées sur ce hint ne sont plus supportées ou ont changé de comportement.

Résultat :

  • des requêtes qui fonctionnaient avant produisent maintenant des résultats différents

  • nécessité de revoir certaines stratégies de DISTINCT côté JPQL ou Criteria

Séquences de base de données

Certaines séquences ont dû être modifiées :

  • stratégies de génération (allocationSize, sequenceName)

  • compatibilité avec les nouvelles versions Hibernate

  • comportement différent selon le dialecte

Ce point est critique sur des applications avec beaucoup d’écritures en base.

Pour avoir effectuer énormément de migration de spring boot, je dirais que souvent c'est dans les requêtes que souvent qu'il y a des problèmes. Hibernate change beaucoup, une rêquetes qui passait ne fonctionne pu... mais fonctionne pourtant encore avec d'autre ORM. Maintenant j'évite d'écrire des requêtes dynamiques en employant les Specification ou JPQL. Je préfère opter pour du natif.


Dépréciations : beaucoup de nettoyage

La migration a mis en lumière :

  • un grand nombre d’API : jpa, sécurité dépréciées
  • des patterns devenus obsolètes

Résultat positif : un code plus propre, plus explicite et plus aligné avec les standards actuels.


Bilan global

Migration faisable sur une base de code de petite taille en moins d'une journée.

Temps de démarrage rapide, même avant corrections

Écosystème Spring mature malgré les changements majeurs

Convention over configuration a permis de diminuer le temps de migration. 

Effort réel sur :

  • Hibernate
  • JPA Criteria / Specifications
  • Sécurité
  • Jakarta

Commentaires

Posts les plus consultés de ce blog

Toshiba AC100 et Android 4

Toshiba AC100 est un smartbook. Toshiba est la seule grosse entreprise qui a commercialisé un smartbook, malgré que plusieurs autres en aient présenté. Un smartbook est similaire à un netbook (taille) en plus d'avoir des caractéristiques souvent proche à un mobile (GPS, 3g, processeur ARM, autonomie). Le Toshiba AC100 utilisait le système d'exploitation Android en version 2.1. Toshiba a effectué une mise à jour Android 2.2. Il a arrêté la commercialisation et le support de cette machine. L'appareil ayant un bon rapport qualité/prix, la communauté le prit en charge. Il est possible d'installer une version beaucoup plus récente d'Android telle que la 4.1. La rom alternative Cyanogen a été utilisée pour ce portage. Les procédures citées ont été faites sous Linux.  Sous Windows, il faut télécharger une version de nvflash pour ce système. Préparation Télécharger les fichiers: cm_ac100-ota-eng.cm10-beta2.zombah.zip recovery.ac100-cm10_beta2.img via ce...

Spring data jpa et Hibernate’s Warning “firstResult/maxResults specified with collection fetch”

Nous verrons dans cet article comment corrigé le problème  Hibernate’s Warning “firstResult/maxResults specified with collection fetch” qui peut survenir lorsqu'il y a un fetch d'effectuer et qu'il y a du paging. Nous utiliserons spring data jpa. Détail structure Imaginons une relation 1 à plusieurs Lorsqu'on obtient un parent, on désire obtenir aussi sa liste d'enfants. En sql, il y aurait une jointure à effectuer. Il est question d'une recherche avancé où on pourrait recherche par plusieurs critères. Spécification Création d'une spécification pour construire une requête dynamique @Component public class ParentSpecification {     public Specification<Parent> recherche(RechercheParent recherche) {         return (root, cq, cb) -> {             Join<Parent, enfant> enfantJoin;              List<Predicate> rootPredicates = new ArrayList<>();       ...