Le CDI n'a pas de portée de vue, parce qu'il n'ont pas la notion de vue, donc si vous avez besoin de cette portée, CDI, dans sa forme pure ne peut pas le faire. L'étendue de l'affichage signifie fondamentalement la demande portée + étant AJAX-prêt. C'est pas une vue JSF, comme une page nommée xyz.xhtml
, même si vous voyez JSF <f:viewParam>
et l'aime. Une utilisation fréquente de cas avec vue étendue de haricots est comment obtenir les paramètres GET dans une telle bean. Aussi lire ceci.
Notez que le CDI vit plutôt à l'EJB/couche de service que le JSF/couche de présentation. Ce blog a une belle vue d'ensemble.
Comme tel, @ManagedBean
ne peut pas être entièrement remplacé par la CDI, à nouveau si vous utilisez @ViewScoped
des haricots, du moins pas sans l'extension de CDI ou de l'utilisation de la Couture 3 Faces module. À l'aide de la vue étendue de haricots est presque toujours à se produire lors de l'utilisation de AJAXed JSF 2-kits graphiques basé sur, comme RichFaces, PrimeFaces, IceFaces, etc.
Le mélange des annotations de la mauvaise Java EE 6 paquets peuvent obtenir en difficulté de façon inattendue, de nouveau lors de l'utilisation de RichFaces ou un analogue de l'API:
@javax.faces.bean.ManagedBean
@javax.faces.bean.[Jsf]Scoped
sont pour les composants utilisés uniquement à la couche de présentation, ici par RichFaces, PrimeFaces, etc. Certains composants riches semblent avoir des problèmes avec le CDI annotée et JSF-annoté helper haricots. Si vous obtenez une étrange comportement de vos haricots (ou des haricots qui semblent ne servir à rien) le mauvais mélange des annotations peut être la cause.
Le mélange JSF et CDI, comme
@javax.inject.Named
@javax.faces.bean.[Jsf]Scoped
est possible et fonctionne dans la plupart des cas lorsqu'ils sont référencés à partir de pages JSF, cependant, il ya certaines peu connues questions/inconvénients, par exemple, lors de l' utilisation d'un champ d'application JSF qui CDI n'a pas:
Aussi la combinaison @Named @ViewScoped
ne fonctionne pas comme prévu. Dans le cadre du programme spécifique @ViewScoped
fonctionne en combinaison avec la JSF-spécifique @ManagedBean
seulement. Votre CDI-spécifique @Named
va se comporter comme @RequestScoped
de cette façon. Utiliser @ManagedBean
au lieu de @Named
ou l'utilisation CDI-spécifique @ConversationScoped
au lieu de @ViewScoped
.
Alors
@javax.inject.Named
@javax.faces.bean.[Cdi]Scoped
peut être utilisé pour le CDI haricots directement référencé à partir de vos pages JSF autant que je sache. Je n'ai pas eu de problèmes avec les combinaisons ci-dessus, jusqu'à présent, de sorte que vous pourriez envisager @ManagedBean
obsolète ici.
Ce qui est à gauche est la couche de service, ici essentiellement de nature transactionnelle de l'EJB service de haricots déclaré que
@javax.ejb.*
la plupart @javax.ejb.Apatrides. Vous pouvez même les annoter et de l'utilisation des Ejb directement à partir de pages JSF - si je ne suis pas sûr si cela est souhaitable. De référence (injecter) tous les composants annotée avec @javax.ejb.*, par exemple, @Stateless
, préfèrent @Inject
sur @EJB
, comme décrit ici. (Probablement un ancêtre de cette réponse...)
Enfin, une très belle présentation de Java EE 6, les annotations peuvent être trouvés ici:
http://www.physics.usyd.edu.au/~rennie/javaEEReferenceSheet.html
Remarque: ce qui précède n'est pas d'info d'un expert, mais tout simplement mon propre/la vue à partir d'un point de vue des nouveaux arrivants sur cette ridiculement confusion Java EE 6 annotations spaghetti. Plus de perspicacité n'est pas encore élaboré. J'espère que cette réponse peut supporter d'être un général, la réponse pratique à cette confusion - même si il est allé un peu trop loin dans le contexte de la question d'origine.