Question

Je viens de commencer la lecture par le biais de base JavaServer Faces, 3e éd. et ils disent que ce (Souligné par l'auteur ):

  

Il est un accident historique qu'il existe deux mécanismes distincts, les haricots CDI   et JSF géré les haricots, pour les haricots qui peuvent être utilisés dans les pages JSF. Nous vous proposons   que vous utilisez des haricots CDI à moins que votre demande doit travailler sur une servlet plaine   coureur tel que Tomcat.

Pourquoi? Ils ne fournissent pas aucune justification . Je me sers @ManagedBean pour tous les haricots dans une application prototype en cours d'exécution sur GlassFish 3, et je ne l'ai pas vraiment remarqué de problèmes avec cela. Cela ne me dérange pas particulièrement la migration de @ManagedBean à @Named, mais je veux savoir pourquoi je dérange .

Était-ce utile?

La solution

CDI est préféré sur JSF simple car CDI permet l'injection de dépendance à l'échelle JavaEE. Vous pouvez également injecter POJO et laissez-les gérer. Avec JSF, vous pouvez seulement injecter un sous-ensemble de ce que vous pouvez avec le CDI.

Autres conseils

Utilisez CDI.

Comme par JSF 2.3, @ManagedBean est Obsolète . Voir aussi spec question 1417. Cela signifie que il n'y a pas plus d'une raison de choisir @ManagedBean sur @Named. Ce fut d'abord mis en œuvre dans la version bêta 2.3.0 Mojarra M06.

 entrer image description ici


Histoire

La différence principale est, @ManagedBean est géré par le cadre JSF et est uniquement via @ManagedProperty disponible à un autre beans gérés JSF. @Named est géré par le serveur d'application (le contenant) par l'intermédiaire cadre CDI et par @Inject disponible pour tout type de un conteneur artefact géré comme @WebListener, @WebFilter, @WebServlet, @Path, @Stateless, etc. et même un @ManagedBean JSF. De l'autre côté, @ManagedProperty fonctionne pas dans un @Named ou tout autre artefact géré par le conteneur. Il fonctionne vraiment seulement à l'intérieur @ManagedBean.

Une autre différence est que le CDI injecte en fait procuration déléguer à l'instance en cours dans le champ d'application cible sur un per-request / base de fil (comme la façon dont on a injecté EJB). Ce mécanisme permet l'injection d'un grain d'une portée plus étroite dans un grain d'une portée plus large, ce qui est impossible avec JSF @ManagedProperty. JSF « injectent » ici l'instance physique directement en invoquant un setter (qui est aussi exactement pourquoi un setter est nécessaire, alors que pas requis avec @Inject).

Bien que pas directement un inconvénient - il existe d'autres moyens - 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 pouvez aussi simplement garder les beans gérés par @ManagedBean. Il est comme protected par rapport public. Mais cela ne compte pas vraiment.

Au moins, dans JSF 2.0 / 2.1, l'inconvénient majeur de la gestion des grains de support JSF par le CDI est qu'il n'y a pas d'équivalent CDI de @ViewScoped. Le @ConversationScoped se rapproche, mais nécessite encore le démarrage manuel et d'arrêt et un paramètre ajoute la demande de cid laide aux URL des résultats. MyFaces CODI facilite par entièrement transparente pont de javax.faces.bean.ViewScoped de JSF CDI afin que vous pouvez juste faire @Named @ViewScoped, mais un paramètre qui ajoute de la demande de windowId laid URL de résultats, également sur la navigation la page à la page vanilles. OmniFaces permet de résoudre tout cela avec un vrai CDI @ViewScoped qui lie vraiment la portée du haricot à vue JSF état au lieu de un paramètre de requête arbitraire.

JSF 2.2 (qui est libéré 3 ans après cette question / réponse) offre une nouvelle annotation @ViewScoped entièrement compatible CDI sur la boîte à saveur de javax.faces.view.ViewScoped. JSF 2.2 vient même avec un @FlowScoped CDI seule qui n'a pas d'équivalent @ManagedBean, poussant les utilisateurs de JSF par le présent vers CDI. L'attente est que @ManagedBean et les amis seront dépréciés comme par Java EE 8. Si vous utilisez actuellement encore @ManagedBean, il est donc fortement recommandé de passer à CDI à be préparé pour les chemins de mise à niveau futures. CDI est facilement disponible dans le profil Java EE Web conteneurs compatibles, 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?

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

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

J'utilisais CDI dans GlassFish 3.0.1, mais pour l'obtenir au travail, je devais importer le cadre Seam 3 (soudure). Cela a fonctionné assez bien.

Dans GlassFish 3.1 CDI a cessé de fonctionner, et le cordon de soudure a cessé de travailler avec elle. J'ai ouvert un bug sur cette mais ne l'ai pas vu encore fixé. Je devais convertir tout mon code à utiliser les javax.faces. * Annotations, mais je prévois de revenir à CDI une fois qu'ils le faire fonctionner.

Je suis d'accord que vous devez utiliser CDI, mais une question que je ne l'ai pas vu encore résolu est ce qu'il faut faire avec l'annotation @ViewScoped. J'ai beaucoup de code qui en dépend. On ne sait pas si @ViewScoped fonctionne si vous ne l'utilisez @ManagedBean avec elle. Si quelqu'un peut clarifier cela, je vous serais reconnaissant.

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

Par contre, @ViewScoped est une raison impérieuse de rester avec JSF @ManagedBean - surtout pour quoi que ce soit avec AJAX significatif. Il n'y a pas de remplacement standard pour ce en CDI.

Il semble que cela peut avoir un certain appui pour une annotation comme @ViewScoped pour les haricots CDI, mais je n'ai pas joué avec lui personnellement.

http://seamframework.org/Seam3/FacesModule

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top