Fèves de soutien (@ManagedBean) ou fèves CDI (@Named)?

je viens de commencer la lecture par le biais de Cœur de JavaServer Faces, 3ème Ed. et ils disent ceci (je souligne):

c'est un accident historique qu'il existe deux mécanismes distincts, le CDI beans et JSF a géré des haricots, pour les haricots qui peuvent être utilisés dans les pages JSF. nous vous suggérons que vous utilisez des haricots CDI à moins que votre application doit fonctionner sur un servlet simple coureur comme Tomcat.

pourquoi? Ils ne fournissent pas de justification ou . J'ai utilisé @ManagedBean pour tous les haricots dans une application prototype 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 à @Named , mais je veux savoir pourquoi je devrais m'embêter .

102
demandé sur Tiny 2010-12-03 19:05:11
la source

5 ответов

CDI est préféré au JSF simple car le CDI permet l'injection de dépendances à L'échelle de JavaEE. Vous pouvez également injecter des POJOs et les laisser être gérés. Avec JSF, vous ne pouvez injecter qu'un sous-ensemble de ce que vous pouvez injecter avec CDI.

59
répondu Bozho 2010-12-03 19:36:45
la source

utiliser CDI.

selon JSF 2.3, @ManagedBean est déprécié . Voir aussi numéro spécial 1417 . Cela signifie qu'il n'y a plus de raison de choisir @ManagedBean plutôt que @Named . Cela a d'abord été mis en œuvre dans la version beta M06 de Mojarra 2.3.0.

enter image description here


histoire

la différence principale est, @ManagedBean il est géré par JSF framework et n'est disponible que via @ManagedProperty pour un autre JSF managed beans. @Named est géré par application server (le conteneur) via CDI framework et est via @Inject disponible pour tout type d'un conteneur géré artefact comme @WebListener , @WebFilter , @WebServlet , @Path , @Stateless , etc et même un JSF @ManagedBean . De l'autre côté sur, @ManagedProperty ne pas travailler à l'intérieur d'un @Named ou tout autre objet de conteneur géré. Il ne fonctionne vraiment qu'à l'intérieur de @ManagedBean .

une autre différence est que le CDI projette effectivement des procurations déléguant à l'instance actuelle dans le champ cible sur une base par requête/thread (comme la façon dont les EJB sont injectés). Ce mécanisme permet d'injecter un haricot d'un la portée est plus large, ce qui n'est pas possible avec le JSF @ManagedProperty . JSF "injecte" ici l'instance physique directement en invoquant un setter (c'est aussi la raison pour laquelle un setter est requis, alors que c'est pas requis avec @Inject ).

bien qu'il ne s'agisse pas d'un désavantage direct - il y a d'autres façons - la portée de @ManagedBean est simplement limitée. De l'autre point de vue, si vous ne voulez pas exposer "trop" pour @Inject , vous peut également garder vos haricots 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 par le CDI des fèves de soutien JSF est qu'il n'y a pas D'équivalent CDI de @ViewScoped . Le @ConversationScoped est proche, mais nécessite encore de démarrer et d'arrêter manuellement et il ajoute un paramètre de requête cid moche aux URLs des résultats. MyFaces CODI le rend plus facile par entièrement de manière transparente, relier le javax.faces.bean.ViewScoped de JSF au CDI pour que vous puissiez simplement faire @Named @ViewScoped , cependant cela ajoute un paramètre de requête laid windowId aux URLs des résultats, également sur la navigation de page en page. OmniFaces résout tout cela avec un véritable CDI @ViewScoped qui lie réellement la portée du bean à l'état de vue JSF au lieu d'un paramètre de demande arbitraire.

JSF 2.2 (qui est libéré 3 ans après ce question / réponse) offre une nouvelle entièrement compatible CDI @ViewScoped annotation sur la boîte dans la saveur de javax.faces.view.ViewScoped . JSF 2.2 s'accompagne même D'un CDI-seulement @FlowScoped qui n'a pas d'équivalent @ManagedBean , poussant ainsi les utilisateurs de JSF vers le CDI. On s'attend à ce que @ManagedBean et ses amis soient dépréciés selon Java EE 8. Si vous utilisez toujours @ManagedBean , il est donc fortement recommandé de passer au CDI pour être prêt pour de futures mises à niveau. Le CDI est 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 le JSF. Voir aussi comment installer CDI dans Tomcat?

163
répondu BalusC 2017-11-04 12:09:08
la source

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. Le but principal était d'éviter la configuration dans la face-config.fichier xml pour utiliser le bean à l'intérieur d'une Page JSF.
  • @javax.annotation.ManagedBean(“myBean”) est défini par la JSR 316. Il généralise les fèves JSF gérées pour une utilisation ailleurs en Java EE 151970920"
  • @javax.inject.Named(“myBean”) sont presque les mêmes, ci-dessus, sauf qu'il faut un fèves.fichier xml dans le dossier web/WEB-INF pour activer le CDI.
13
répondu h2mch 2010-12-09 13:55:49
la source

J'utilisais le CDI dans GlassFish 3.0.1, mais pour le faire fonctionner j'ai dû importer le cadre Seam 3 (soudure). Cela a fonctionné assez bien.

dans GlassFish 3.1 le CDI a cessé de fonctionner, et la soudure de couture a cessé de fonctionner avec elle. J'ai ouvert un bug sur ce bug mais je ne l'ai pas encore vu réparé. J'ai dû convertir tout mon code en utilisant le javax.face.* annotations mais j'ai l'intention de revenir au CDI une fois qu'il sera opérationnel.

je suis d'accord devrait utiliser CDI, mais un problème que je n'ai pas encore vu résolu est ce qu'il faut 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.

2
répondu AlanObject 2010-12-25 05:00:46
la source

une bonne raison de passer au CDI: vous pourriez avoir une ressource commune de session-scoped (profil de l'utilisateur par exemple) @Inject 'ed dans les deux JSF haricots gérés et services de repos (c.-à-d., Jersey/JAX-RS).

d'un autre côté, @ViewScoped est une raison impérieuse de s'en tenir au JSF @ManagedBean - en particulier pour tout ce qui a un AJAX important. Il n'y a pas de solution de remplacement standard à ce problème au CDI.

semble qu'il peut avoir un certain soutien pour un @ViewScoped - comme annotation pour les haricots CDI, mais je n'ai pas joué avec elle personnellement.

http://seamframework.org/Seam3/FacesModule

0
répondu wrschneider 2016-07-19 16:54:02
la source

Autres questions sur jsf jsf-2 java-ee cdi