requestscoped - version de jsf




Sauvegarde de beans(@ManagedBean) ou CDI Beans(@Named)? (4)

Utilisez CDI.

Selon JSF 2.3, @ManagedBean est obsolète . Voir aussi le numéro de spécification 1417 . Cela signifie qu'il n'y a plus de raison de choisir @ManagedBean sur @Named . Cela a été d'abord implémenté dans Mojarra 2.3.0 beta version m06.

Histoire

La principale différence est que @ManagedBean est géré par le framework JSF et n'est accessible que via @ManagedProperty à un autre @ManagedBean géré par JSF. @Named est géré par le serveur d'application (le conteneur) via le framework CDI et est @Inject via @Inject à tout type d'artefact géré par conteneur tel que @WebListener , @WebFilter , @WebServlet , @Path , @Stateless , etc. et même un JSF @ManagedBean . De l'autre côté, @ManagedProperty ne fonctionne pas à l' intérieur d'un artefact géré par @Named ou un autre artefact géré par un conteneur. Cela fonctionne vraiment seulement dans @ManagedBean .

Une autre différence est que CDI injecte réellement des proxies délégant à l'instance actuelle dans la portée cible sur une base par demande / thread (comme la façon dont les EJB ont été injectés). Ce mécanisme permet d'injecter un bean d'une portée plus étroite dans un bean d'une portée plus large, ce qui n'est pas possible avec JSF @ManagedProperty . JSF "injecte" ici directement l'instance physique en invoquant un setter (c'est aussi exactement pourquoi un setter est requis, alors que cela n'est pas requis avec @Inject ).

Bien qu'il ne soit pas directement un inconvénient - il existe d'autres moyens - la portée de @ManagedBean est simplement limitée. D'un autre point de vue, si vous ne voulez pas exposer «trop» pour @Inject , vous pouvez également garder vos beans gérés @ManagedBean . C'est comme protected contre public . Mais cela ne compte pas vraiment.

Au moins, dans JSF 2.0 / 2.1, le principal inconvénient de la gestion des beans backing JSF par CDI est qu'il n'y a pas d'équivalent CDI de @ViewScoped . @ConversationScoped se rapproche, mais nécessite toujours un démarrage et un arrêt manuels et il ajoute un paramètre de demande cid moche aux URL de résultats. MyFaces CODI le rend plus facile en joignant de manière transparente javax.faces.bean.ViewScoped de JSF à CDI de sorte que vous pouvez simplement @Named @ViewScoped , mais qui ajoute un paramètre de demande windowId laid aux URL de résultats, également sur plain-vanilla page-to-page la navigation. OmniFaces résout tout cela avec un vrai CDI @ViewScoped qui lie vraiment la portée du bean à l'état d'affichage JSF au lieu d'un paramètre de requête arbitraire.

JSF 2.2 (qui est publié 3 ans après cette question / réponse) offre une nouvelle annotation @ViewScoped entièrement compatible CDI sur la case dans la saveur de javax.faces.view.ViewScoped . JSF 2.2 vient même avec un @FlowScoped seulement @FlowScoped qui n'a pas d'équivalent @ManagedBean , poussant ainsi les utilisateurs de JSF vers CDI. On s'attend à ce que @ManagedBean et ses amis soient obsolètes selon Java EE 8. Si vous utilisez actuellement @ManagedBean , il est donc fortement recommandé de passer en mode CDI afin d'être prêt pour les futurs chemins de mise à niveau. CDI est facilement disponible dans des conteneurs compatibles Java EE Web Profile, tels que WildFly, TomEE et GlassFish. Pour Tomcat, vous devez l'installer séparément, exactement comme vous l'avez déjà fait pour JSF. Voir aussi Comment installer CDI dans Tomcat?

Je viens de commencer à lire Core JavaServer Faces, 3rd Ed. et ils disent ceci (emphase le mien):

C'est un accident historique qu'il existe deux mécanismes distincts, les beans CDI et les beans gérés par JSF, pour les haricots qui peuvent être utilisés dans les pages JSF. Nous vous suggérons d'utiliser des beans CDI à moins que votre application ne fonctionne sur un coureur de servlet simple tel que Tomcat.

Pourquoi? Ils ne fournissent aucune justification. J'ai utilisé @ManagedBean pour tous les beans dans une application prototype fonctionnant sur GlassFish 3, et je n'ai pas vraiment remarqué de problèmes avec ça. Cela ne me dérange pas particulièrement de migrer de @ManagedBean vers @Named , mais je veux savoir pourquoi je devrais m'en préoccuper .


Avec Java EE 6 et CDI vous avez une option différente pour les haricots gérés

  • @javax.faces.bean.ManagedBean se réfère à JSR 314 et a été introduit avec JSF 2.0. L'objectif principal était d'éviter la configuration dans le fichier faces-config.xml pour utiliser le bean dans une page JSF.
  • @javax.annotation.ManagedBean(“myBean”) est défini par JSR 316. Il généralise les beans gérés JSF pour une utilisation ailleurs dans Java EE
  • @javax.inject.Named(“myBean”) est presque le même que celui ci-dessus, sauf que vous avez besoin d'un fichier beans.xml dans le dossier web / WEB-INF pour activer CDI.

J'utilisais CDI dans GlassFish 3.0.1, mais pour le faire fonctionner, j'ai dû importer le framework Seam 3 (Weld). Cela a plutôt bien fonctionné.

Dans GlassFish 3.1, CDI a cessé de fonctionner et la soudure Seam a cessé de fonctionner. J'ai ouvert un bug à ce sujet mais je ne l'ai pas encore vu. J'ai dû convertir tout mon code en utilisant les annotations de javax.faces. * Mais je prévois de revenir à CDI une fois qu'elles fonctionneront.

Je suis d'accord que vous devriez utiliser CDI, mais un problème que je n'ai pas encore résolu est de savoir quoi faire avec l'annotation @ViewScoped. J'ai beaucoup de code qui en dépend. Il n'est pas clair si @ViewScoped fonctionne si vous n'utilisez pas @ManagedBean avec. Si quelqu'un peut clarifier cela, je l'apprécierais.


Une bonne raison de passer au CDI: vous pouvez avoir une ressource de portée commune (par exemple le profil de l'utilisateur) @Inject dans les beans gérés JSF et les services REST (par exemple, Jersey / JAX-RS).

D'autre part, @ViewScoped est une raison convaincante de rester avec JSF @ManagedBean - en particulier pour tout ce qui a AJAX significatif. Il n'y a pas de remplacement standard pour cela dans CDI.

On dirait qu'il peut avoir un certain support pour une annotation semblable à @ViewScoped pour les beans CDI, mais je n'ai pas joué avec lui personnellement.

http://seamframework.org/Seam3/FacesModule





cdi