Framework Seam ... disparu des radars?

Un petit article souvenir pour les vieux comme moi : qui se souvient encore du framework JBoss Seam ?
Ce framework était particulièrement en vogue et connu par ceux qui ont développé des applications Java-JEE au début des années 2010.
Assez utilisé à l’époque de Java 5, ce framework de développement d’applications web, conçu par RedHat, avait pour objectif de simplifier et accélérer les processus de développement.
Une de ses principales caractéristiques est l’intégration du Design Pattern dit de " conversation «, que nous allons développer plus loin dans cet article.
Le framework Seam donc, fourni par JBoss (aujourd’hui WildFly, appartenant au groupe RedHat) était très associé aux projets Hibernate / EJB3 / JSF.
Même s’il est pratiquement devenu inexistant de nos jours, il est très intéressant de revenir quelques instants à son sujet, tant les problématiques qu’il résout restent d’actualité et ont fortement évolué depuis.
Qu’est ce que Seam ?
JBoss SEAM était donc un framework JEE pour architecture client/serveur, très adapté pour les projets en architecture 3-Tiers de l’époque fin des années 2000 / début des années 2010.
Créé par Gavin King (également connu pour avoir créé le framework de persistance Hibernate) en collaboration avec RedHat, Seam a rapidement gagné en popularité du fait de sa gestion des conversations et de son utilisation de l’injection de dépendances contextuelles.
L’architecture Seam est également considérée comme un système SSO (Single-Sign On), et gère de ce fait les transactions associées à une session utilisateur. Le procédé d’authentification est basé sur le protocole d’authentification réseau Kerberos V5.
Seam est très fortement lié à l’architecture EJB 3.0, et remonte au bon vieux temps de l’utilisation d’AJAX pour l’interconnectivité côté client. Très souvent associé à des applications disposant d’un frontend JSF, en vogue à cette époque également.
Et comme dit plus haut, afin de répondre à une problématique d’accès vers des ressources stateful, Seam propose un modèle dit de conversation : c’est son modèle phare en quelque sorte, que je vais expliciter plus loin dans cet article.
Historique
Pour se faire une idée rapidement de l’apport du framework Seam, voici un petite rétrospective des différentes versions et fonctionnalités introduites :
Seam 1.0 : La première version de JBoss Seam a été lancée en septembre 2006. Cette première version introduira déjà son concept-clé : la gestion des conversations ainsi que l’injection de dépendances contextuelles.
Seam 2.0 : Cette seconde version, publiée en septembre 2007, a apporté des améliorations significatives à la fois en termes de fonctionnalités et de performances.
S’y verra ajouté un support pour la création de services RESTful, des améliorations de la gestion des conversations, ainsi que des intégrations plus poussées avec d’autres frameworks de l’écosystème Java EE, tels que JSF, JPA, EJB.
Seam 2.1 : Publiée en juin 2008, cette version introduit des fonctionnalités supplémentaires telles que le support pour les événements globaux, les améliorations de la gestion des sessions utilisateur et des optimisations de performance. Un autre apport, et non des moindres, est l’ajout du module de sécurité Seam Security.
Seam 2.2 : Lancée en avril 2009, cette version a principalement introduit des corrections de bugs et des améliorations de stabilité, tout en maintenant la compatibilité avec les versions précédentes.
Seam 3.0 : La version 3 de Seam, publiée en novembre 2010, marque un changement significatif dans son architecture.
S’y ajoute une évolution du mécanisme d’injection de dépendances principal : transition vers la spécification dite " CDI « (Contexts and Dependency Injection).
Elle introduira également des fonctionnalités plus modernes telles que la prise en charge de Java EE 6, ainsi qu’une modularité.
Seam 3.1 : Lancée en mars 2012, cette dernière version apportera des améliorations de performance, des correctifs de bugs et une meilleure intégration avec les autres technologies Java EE.
Les sources n’ont plus été modifiées depuis 2012.
Fonctionnement
Entrons à présent dans le vif du sujet.
Le framework Seam est donc conçu pour simplifier l’intégration et la gestion de complexité des applications JEE.
De ce fait, il s’intégre et coexiste parfaitement avec les technologies EJB 3, JPA/Hibernate, JSF, JSP et les Servlets.
Voyons en détail comment Seam s’intégre avec ces technologies :

Intégration avec EJB (Enterprise JavaBeans)
Seam simplifie l’utilisation d’Enterprise Java Beans (EJB), particulièrement avec les EJB 3 introduits par Java 5 pour la logique métier.
Il permet une gestion transparente des transactions en liant les conversations longues et les transactions avec un contrôle plus facile de l’état de l’application.
L’annotation @In permet d’injecter des beans EJB dans des classes Seam, permettant ainsi une gestion de la logique métier sans la surcharge habituelle des appels EJB.
Conversations longues : Seam permet de maintenir des conversations longues (par exemple, sur plusieurs pages) grâce à un contexte de conversation étendu. Cela permet de garder une session de conversation active entre les différentes étapes de l’application (par exemple, une commande d’achat).
Intégration avec JPA (Java Persistence API) et Hibernate
Seam fonctionne bien avec JPA (et donc avec Hibernate, qui est une implémentation de JPA), facilitant la gestion de la persistance des données.
L’intégration Seam/JPA permet d’utiliser des entités JPA directement dans les beans Seam sans avoir à gérer manuellement les transactions.
Seam utilise des annotations comme @In pour injecter des entités persistantes dans les composants Seam.
Seam gère automatiquement la transactionnalité lors des appels à des entités JPA, ce qui simplifie la gestion des transactions.
Intégration avec JSF (JavaServer Faces)
JSF est souvent utilisé avec Seam pour la partie présentation des applications. Seam offre une meilleure gestion de la navigation et des événements dans JSF.
Seam gère le contexte utilisateur (par exemple, les informations liées à un utilisateur pendant sa session) et l’injection de dépendances dans des composants JSF via l’annotation @In.
Avec Seam, les actions JSF peuvent être liées aux méthodes EJB et les résultats de ces actions peuvent être utilisés pour manipuler l’interface utilisateur de manière fluide.
Seam permet de manipuler des formulaires et de lier des données entre les composants JSF et les beans de gestion d’état.
Intégration avec JSP (JavaServer Pages) et Servlets
Bien que Seam s’intègre principalement avec JSF, il peut aussi fonctionner avec JSP et Servlets, bien que cela soit moins courant.
Pour les JSP, Seam peut être utilisé pour gérer les actions et les événements tout comme dans les applications JSF, mais en utilisant des pages JSP au lieu des composants JSF.
Seam permet d’injecter des objets dans des Servlets ou des JSP via son mécanisme d’injection de dépendances et d’événements.
Portails (JSR 168 / 286)
Seam peut aussi être intégré dans des portails Java (comme Liferay ou JBoss Portal).
Ainsi, dans ce contexte, Seam gère en continu l’état de la session utilisateur ainsi que les conversations longues au sein des portlets.
Les portlets peuvent ainsi utiliser les beans Seam pour accéder à des données ou effectuer des actions, ce qui permet de garder une gestion cohérente de l’état de manière continue.
Sécurité et transactions
Seam permet également de gérer la sécurité via des mécanismes intégrés qui permettent de définir des rôles et des permissions sur les méthodes et les composants EJB.
Pour les transactions, Seam prend en charge les transactions distribuées.
Les conversations dans Seam sont particulièrement utiles pour maintenir un état entre plusieurs requêtes, ce qui est crucial dans des systèmes où l’utilisateur interagit avec plusieurs composants, comme les formulaires sur plusieurs pages.
Pattern et architecture
Seam fonctionne sur le pattern MVC (Modèle-Vue-Contrôleur) en combinant JSF pour la couche Vue et EJB (ou d’autres composants métier) pour la couche Modèle, le framework Seam lui-même assurant la couche Contrôleur.
Il facilite l’utilisation de conversations pour garder un état entre différentes étapes de l’interaction avec l’utilisateur. Cela permet de diviser les interactions en étapes et d’associer des valeurs spécifiques à l’utilisateur durant toute une session.
Seam permet aussi une abstraction de la logique d’accès aux données et à la persistance en cachant certaines complexités sous-jacentes (comme la gestion des transactions et des sessions).
Le framework propose également une gestion de workflows via JBPM (JBoss Process MAnagement), en utilisant le langage natif de JPPM : jPDL (jBPM Process Definition Language)
Le framework de Conversation
Seam se démarque en grande partie du fait de sa proposition de modèle dit de "Conversation", par lequel il va permettre la propagation du contexte des données entre les différentes couches de l’application.
Le concept de gestion des conversations permet aux développeurs de gérer l’état des conversations utilisateur de manière globale et transparente.
Une conversation représente une interaction utilisateur avec l’application, et Seam permet de gérer automatiquement les données associées à chaque conversation, y compris la préservation de l’état des composants et des dépendances.
Le pattern de conversation est une approche de gestion de l’état de l’utilisateur au cours d’une série d’interactions avec l’application, souvent sur plusieurs requêtes HTTP.
Contrairement à une session qui peut durer toute la durée de la session d’un utilisateur dans une application web, une conversation est limitée à une série d’interactions liées à un processus spécifique, comme un formulaire ou une commande.
Annotations et mécanisme de gestion des conversations :
Le framework utilise des annotations comme @Begin, @End, @In, @Out pour marquer des points de début et de fin de conversation. Par exemple :
@Begin démarre une conversation lorsqu’une action utilisateur (comme cliquer sur un bouton) est effectuée.
@End marque la fin d’une conversation lorsque l’utilisateur termine le processus (par exemple, après avoir confirmé la commande).
@In et @Out permettent de transférer les données entre les différentes étapes de la conversation.
Seam gère également la durée des conversations (par exemple, une conversation peut être temporaire ou persistée).
Séparation des responsabilités :
Le framework gère l’état de manière automatique et transparente, permettant au développeur de se concentrer sur la logique métier plutôt que sur la gestion de l’état de session.
Cela permet également une abstraction de la complexité : Seam abstrait la gestion des sessions et des transactions, rendant le développement d’applications plus fluide et la logique de gestion des états plus simple à implémenter.
Seam Security
à partir de la version 2.1, Seam Security fournit également un module de sécurité offrant des fonctionnalités avancées de sécurité côté WEB.
Il a ainsi permis aux développeurs de sécuriser facilement leurs applications en fournissant un ensemble de fonctionnalités intégrées pour l’authentification, l’autorisation et la gestion des identités (très analogue à Spring Security).
Et aujourd’hui ?
De nos jours, en raison des énormes évolutions depuis, le framework Seam est très peu utilisé dans le monde du développement logiciel.
JBoss Seam a atteint sa fin de vie en mars 2013, avec Red Hat encourageant les utilisateurs à migrer vers des alternatives plus modernes et maintenues, telles que CDI et d’autres frameworks Java EE.
Bien que JBoss Seam ne soit plus activement développé ni pris en charge, son influence sur le développement d’applications Java EE reste significative, et de nombreuses idées et concepts de Seam ont été intégrés dans d’autres frameworks et technologies Java EE.
Attention : Noter également que les librairies Seam sont soumises aujourd’hui (2025) à énormément de failles de sécurité :
CVE-2022-23307, CVE-2022-23305, CVE-2022-23302, CVE-2022-1415, CVE-2021-41411, CVE-2021-4104, CVE-2020-25638, CVE-2020-10683, CVE-2019-17571, CVE-2019-14900, CVE-2018-1000632, CVE-2014-8125
