web-dev-qa-db-fra.com

@ @Manédébeans sont obsolètes à Javaee6 à cause de @NAMED dans CDI / SOUDIER?

En raison de CDI (et de sa soudure de mise en œuvre), chaque pojo de Jee6 peut être annoté avec @Named, qui rend le pojo accessible à la vue.

Cela signifie-t-il que les gènes sont complètement obsolètes maintenant? Ou ai-je manqué quelque chose où @ManagedBean a toujours du sens?

41
Ingo Fischer

En bref, @ManagedBean a du sens pour les applications qui utilisent JSF mais n'utilisent pas JSR 299 (quelle que soit la raison pour laquelle la raison est). Au-dessous d'une explication plus longue de Gavin King:

Re: comparaisons aux annotations @managedbean à JSF2? :

Tout en regardant à travers les exemples de soudure et la documentation de l'ancienne Documentation Webbeans, elle ressemble à un concurrent aux nouvelles annotations @manageDbean JSF 2.0. Y a-t-il des informations sur lorsque nous voudrions utiliser un sur l'autre?

C'est une bonne question et je ne suis pas vraiment en parfait accord avec les réponses qui ont été publiées jusqu'à présent.

La nouvelle spécification de haricots gérés EE définit un modèle de composant de base pour Java EE, ainsi qu'un ensemble de services de conteneurs très basiques (@Resource, @PostConstruct, @PreDestroy).

L'idée est que d'autres spécifications (en commençant par l'EJB, CDI, JSF et le nouveau Java) sur ce modèle de composant de base et des services supplémentaires de la couche, par exemple la gestion des transactions, l'injection de type de dépendance type. Intercepteurs. Ainsi, à ce niveau, les haricots gérés, les CDI, les intercepteurs et les spécifications d'EJB travaillent tous de la main et sont très complémentaires.

Maintenant, la spécification de haricots gérées est assez ouverte en ce qui concerne l'identification exactement quelles classes sont des haricots gérés. Il fournit le @ManagedBean Annotation en tant que mécanisme, mais elle permet également à d'autres spécifications de définir différents mécanismes. Donc, par exemple:

  • La spécification EJB indique qu'une classe obéissant à certaines restrictions de programmation avec un @Stateless ou @Stateful Annotation déployée dans un JAR EJB est un haricot géré.

  • La spécification CDI affirme que toute classe avec un constructeur approprié déployé dans une "archive de déploiement de haricots" est un haricot géré.

Étant donné que l'EJB et la CDI fournissent des moyens sans doute plus pratiques d'identifier un haricot géré, vous pourriez vous demander précisément quels @ManagedBean est nécessaire pour. La réponse, telle que mentionnée par Dan, est que si vous avez un CDI disponible dans votre environnement (par exemple, si vous utilisez EE6), alors @ManagedBean'est tout simplement pas vraiment nécessaire. @ManagedBean est vraiment là pour une utilisation par des personnes qui utilisent JSF2 sans CDI .

OTOH, si vous annotez un haricot @ManagedBean, et vous avez un CDI dans votre environnement, vous pouvez toujours utiliser CDI pour injecter des choses dans votre haricot. C'est juste que le @ManagedBean Annotation n'est pas Obligatoire Dans ce cas.

Pour résumer, si vous avez un CDI disponible pour vous, il fournit un fichier loin Modèle de programmation supérieure à l'@ManagedBean/@ManagedProperty Modèle que JSF2 hérite de JSF1 . Donc Supérieur, en fait, que le profil Web EE 6 ne nécessite pas de support pour @ManagedProperty etc. L'idée étant que vous devriez simplement utiliser CDI à la place.

51
Pascal Thivent

Tu as le choix. Utilisez l'@managedbean à partir de JSF2 pour lier les haricots dans vos formulaires ou utiliser l'annotation @NAMED de CDI. Si vous envisagez uniquement de faire JSF, vous pouvez vous tenir à @ManèdeBean, mais si vous souhaitez intégrer avec EJB, ou utilisez CDI's @ConversationsCoped, puis allez à la route CDI.

Personnellement, je sens que la prochaine version de JSF devrait décréter le @managedbean et standardiser sur CDI. La dualité est confuse pour les nouveaux arrivants.

15
Brian Leathem

CDI n'a aucune portée d'opinion, car elle n'a pas la notion de vue , donc si vous avez besoin de cette portée, CDI sous sa forme pure ne peut pas le faire. Afficher la portée signifie fondamentalement Demande de portée + étant AJAX-READY . C'est non une vue JSF, comme une page nommée xyz.xhtml, même si vous voyez JSF <f:viewParam> et les goûts. Un étui à usage fréquent avec des haricots à visualisation est Comment obtenir des paramètres d'un tel haricot . Aussi Lisez ceci .

Notez que CDI plutôt vit à la couche EJB/service que la couche JSF/PRESENTATION. Ce blog a une vue d'ensemble agréable.

En tant que tel @ManagedBean ne peut pas être complètement remplacé par CDI, à nouveau si vous utilisez @ViewScoped haricots - au moins pas sans étendue CDI ou à l'aide du module couture 3 faces . À l'aide des haricots à visualisation, on se produira presque toujours lors de l'utilisation d'une boîte à outils GUI à base de JSF à 2 Ajaxed, tels que RichFaces, PremiersFaces, Icefaces, etc.

Mélanger les annotations du mauvais Java EE 6 packages peut ​​Vous pouvez vous mettre en difficulté de manière inattendue, encore une fois lorsque vous utilisez des riches riches ou une API similaire:

@javax.faces.bean.ManagedBean
@javax.faces.bean.[Jsf]Scoped

sont destinés à des composants utilisés uniquement à la couche de présentation, ici par Richfaces, PremiersFaces, etc. Certains composants riches semblent avoir des problèmes avec l'assistant CDI-Annoté et JSF-Annoté haricots . Si vous obtenez un comportement étrange de vos haricots (ou des haricots qui semblent ne rien faire), le mauvais mélange d'annotations pourrait être la cause.

Mélanger JSF et CDI, comme

@javax.inject.Named
@javax.faces.bean.[Jsf]Scoped

est possible et fonctionne dans la plupart des cas lorsqu'il est référencé des pages JSF, mais il existe des problèmes/inconvénients peu connus, par ex. Quand à l'aide d'une portée JSF que CDI n'a pas :

Aussi la combinaison @Named @ViewScoped ne fonctionnera pas comme prévu. Le JSF spécifique @ViewScoped fonctionne en combinaison avec Spécifique JSF @ManagedBean seul. Votre CDI-spécifique @Named va se comporter comme @RequestScoped Par ici. Soit utiliser @ManagedBean à la place de @Named ou utiliser un CDI-spécifique @ConversationScoped à la place de @ViewScoped.

Puis

@javax.inject.Named
@javax.faces.bean.[Cdi]Scoped

peut être utilisé pour les haricots CDI directement référencés à partir de vos pages JSF Afaik. Je n'ai eu aucun problème avec les combinaisons ci-dessus jusqu'à présent, afin que vous puissiez considérer @ManagedBean obsolète ici.

Ce qui reste est la couche de service, ici surtout des haricots de service EJB transactionnelles déclaré comme

@javax.ejb.*

surtout @ javax.ejb.sataless. Vous pouvez même annoter et utiliser EJB directement à partir de pages JSF - si je ne sais pas si cette conception est souhaitable. Pour référencer (injecter) tout composant annoté avec @ javax.ejb. *, Par exemple @Stateless, préférer @Inject plus de @EJBcomme décrit ici . (Probablement un ancêtre de cette réponse ...)

Enfin, une très belle vue d'ensemble de Java EE 6 annotations peut être trouvée ici: http://www.physics.usyd.edu.au/~rennnie/javaeereefefefefefefefefefefefreeet.html

Note : L'info ci-dessus n'est pas d'un expert, mais simplement ma propre prise/vue d'un point de vue des nouveaux arrivants sur ce ridiculement déroutant Java ee 6 annotations spaghetti . Plus de perspicacité n'a pas encore été développée. J'espère que cette réponse peut supporter une réponse générale et pratique à cette confusion - même si elle est devenue un peu trop à la côte dans le contexte de la question initiale.

10
Kawu

Comme je viens de lire dans la référence de soudure (p. 12), @ManèdeBean est maintenant superflu:

Vous pouvez expliquer explicitement un haricot géré en annotant la classe de haricots @manfedbean, mais en CDI, vous n'avez pas besoin de. Selon la spécification, le conteneur CDI traite n'importe quelle classe qui satisfait aux conditions suivantes en tant que haricot géré:

  • Ce n'est pas une classe intérieure non statique. C'est une classe concrete ou est annoté @Decorator.
  • Il n'est pas annoté avec une annotation définie par le composant EJB ou déclaré comme une classe de haricots EJB dans EJB-JAR.XML.
  • Il ne met pas en œuvre javax.enterprise.inject.spi.extension.
  • Il a un constructeur approprié - soit:
  • la classe a un constructeur sans paramètres, ni
  • la classe déclare un constructeur annoté @Inject.
7
Ingo Fischer