Je viens de commencer à lire Core JavaServer Faces, 3e éd. et ils disent ceci (c'est moi qui souligne):
C'est un accident historique qu'il existe deux mécanismes distincts, les beans CDI et les beans gérés JSF, pour les beans qui peuvent être utilisés dans les pages JSF. Nous vous suggérons d'utiliser des beans CDI, sauf si votre application doit fonctionner sur un exécuteur 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 cela. Cela ne me dérange pas particulièrement de migrer de @ManagedBean
vers @Named
, mais je veux savoir pourquoi je devrais me déranger .
la source
Réponses:
CDI est préféré au JSF simple car CDI permet l'injection de dépendances à l'échelle de JavaEE. Vous pouvez également injecter des POJO et les laisser gérer. Avec JSF, vous ne pouvez injecter qu'un sous-ensemble de ce que vous pouvez avec CDI.
la source
@ManagedBean
si je veux l'injecter avec plain JSF?Utilisez CDI.
Selon JSF 2.3,
@ManagedBean
est obsolète . Voir également le numéro de spécification 1417 . Cela signifie que il n'y a pas plus d' une raison de choisir@ManagedBean
plus@Named
. Cela a été implémenté pour la première fois dans la version bêta de Mojarra 2.3.0 m06.L'histoire
La principale différence est qu'elle
@ManagedBean
est gérée par le framework JSF et n'est@ManagedProperty
disponible que via un autre beans gérés JSF.@Named
est géré par le serveur d'application (le conteneur) via le framework CDI et est@Inject
disponible pour tout type d'artefact géré par conteneur comme@WebListener
,@WebFilter
,@WebServlet
,@Path
,@Stateless
, etc. et même un JSF@ManagedBean
. De l'autre côté,@ManagedProperty
ne fonctionne pas dans un@Named
ou tout autre artefact géré par conteneur. Cela ne fonctionne vraiment qu'à l'intérieur@ManagedBean
.Une autre différence est que CDI injecte en fait des proxys déléguant à l'instance actuelle dans la portée 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 bean de portée plus étroite dans un bean de portée plus large, ce qui n'est pas possible avec JSF
@ManagedProperty
. JSF "injecte" ici l'instance physique directement en invoquant un setter (c'est aussi exactement pourquoi un setter est nécessaire, alors que ce n'est pas obligatoire avec@Inject
).Bien que ce 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 aussi simplement conserver vos beans gérés@ManagedBean
. C'est commeprotected
contrepublic
. Mais cela ne compte pas vraiment.Au moins, dans JSF 2.0 / 2.1, le principal inconvénient de la gestion des backing beans JSF par CDI est qu'il n'y a pas d'équivalent CDI de
@ViewScoped
. Le@ConversationScoped
se rapproche, mais nécessite toujours un démarrage et un arrêt manuels et ajoute uncid
paramètre de demande laid aux URL de résultat. MyFaces CODI facilite les choses en reliant de manière totalement transparente les JSFjavax.faces.bean.ViewScoped
à CDI afin que vous puissiez simplement le faire@Named @ViewScoped
, mais cela ajoute un vilainwindowId
paramètre de requête aux URL de résultat, également sur la navigation simple de page à page. OmniFaces résout tout cela avec un vrai CDI@ViewScoped
qui lie vraiment la portée du bean à l'état de vue JSF plutôt qu'à un paramètre de requête arbitraire.JSF 2.2 (qui sort 3 ans après cette question / réponse) offre une nouvelle
@ViewScoped
annotation entièrement compatible CDI prête à l'emploi dans la saveur dejavax.faces.view.ViewScoped
. JSF 2.2 est même livré avec un CDI uniquement@FlowScoped
qui n'a pas d'@ManagedBean
équivalent, poussant ainsi les utilisateurs JSF vers CDI. On s'attend à ce que les@ManagedBean
amis soient obsolètes selon Java EE 8. Si vous l'utilisez toujours@ManagedBean
, il est donc fortement recommandé de passer à CDI pour être préparé aux 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?la source
beans.xml
, converti des@ManagedBean
backing beans en@Named
et convertis@ManagedProperty
en@Inject
. Tout va bien avec le monde. Cependant, si je change mes@EJB
annotations en@Inject
, le déploiement échoue (org.jboss.weld.exceptions.DeploymentException
) avec messageWELD-001408 Injection point has unsatisfied dependencies
. Dois-je réellement utiliser@Inject
pour injecter des EJB sans interface dans un@Named
bean, ou devrais-je m'en tenir@EJB
? Les EJB sont emballés dans un JAR EJB, dans le même EAR que le WAR qui contient mes beans CDI.@Named
.@Named @ViewScoped
, mais cela ajoute un paramètre de requête windowId laid aux URL de résultat, également sur la navigation simple de page à page." Notez qu'avec DeltaSpike, cela n'est plus vrai. Vous pouvez désactiver les paramètres d'URL dsId et windowId, si vous n'avez pas besoin de l'étendue de la fenêtre.@ViewScoped
pour JSF 2.0 / 2.1: showcase.omnifaces.org/cdi/ViewScopedAvec Java EE 6 et CDI, vous avez différentes options pour Managed Beans
@javax.faces.bean.ManagedBean
fait référence à 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”)
sont presque les mêmes que celui ci-dessus, sauf que vous avez besoin d'un fichier beans.xml dans le dossier web / WEB-INF pour activer CDI.la source
beans.xml
fichier? Est-ce toujours vrai aujourd'hui?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 le Seam Weld a cessé de fonctionner avec. J'ai ouvert un bug à ce sujet mais je ne l'ai pas encore vu corrigé. J'ai dû convertir tout mon code en utilisant les annotations javax.faces. * Mais je prévois de revenir au CDI une fois qu'il fonctionnera.
Je suis d'accord que vous devriez 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 lui. Si quelqu'un peut clarifier cela, je l'apprécierais.
la source
Une bonne raison de passer à CDI: vous pourriez avoir une ressource commune à la session (profil utilisateur par exemple)
@Inject
dans les beans gérés JSF et les services REST (c'est-à-dire Jersey / JAX-RS).D'autre part,
@ViewScoped
est une raison impérieuse de s'en tenir à JSF@ManagedBean
- en particulier pour tout ce qui a un AJAX important. Il n'y a pas de remplacement standard pour cela dans CDI.Semble qu'il peut avoir un certain soutien pour un
@ViewScoped
annotation-like pour les beans CDI, mais je n'ai pas joué avec personnellement.http://seamframework.org/Seam3/FacesModule
la source