Comment remplacer @ManagedBean / @ViewScope en CDI en JSF 2.0/2.1
Je suis actuellement en train d'évaluer Java EE 6 /JSF 2.1 avec RichFaces.
Un haricot qui est déclarée comme
@ManagedBean
@ViewScoped
- Obtient un IDENTIFIANT (à préparer par exemple une opération de suppression).
- Via JSF une fenêtre de confirmation s'affiche.
- Si l'utilisateur confirme, la suppression de la méthode est invoquée et supprime la ligne dont l'ID est stocké dans l'étape 1.
Depuis CDI haricots n'ont pas ViewScope j'ai essayé de déclarer le bean:
@Named
@ConversationScoped
Maintenant le traitement échoue à l'étape 3. parce que la valeur qui a été définie lors de l'étape 1 (vérifié) n'est plus disponible.
Dois-je utiliser Conversation.begin()
et Conversation.end()
méthodes?
Si oui, où serait bon endroit pour les invoquer?
- Pour une référence future: dans JSF 2.2 il y a un CDI compatible portée de vue dans le noyau de la JSF.
Vous devez vous connecter pour publier un commentaire.
Si vous pouvez mettre à niveau vers JSF 2.2, immédiatement le faire. Il propose un natif
@ViewScoped
annotation pour le CDI.Sinon, installez OmniFaces qui apporte ses propres CDI compatible
@ViewScoped
, y compris un travail@PreDestroy
(qui est cassé sur JSF@ViewScoped
).Une autre alternative est d'installer MyFaces CODI qui de manière transparente les ponts JSF 2.0/2.1
@ViewScoped
de CDI. Cela ne fait qu'ajouter un générée automatiquement les paramètres de la requête à l'URL (comme@ConversationScoped
ferait).Si vous avez vraiment besoin d'utiliser
@ConversationScoped
, alors vous avez en effet besoin de maunally de début et de fin il. Vous devez@Inject
unConversation
et invoquerbegin()
dans le@PostConstruct
etend()
dans la dernière étape de la conversation, généralement d'une méthode d'action qui redirige vers un nouveau point de vue.Voir aussi:
@ViewScoped
bean, par la voie). Notez que la conversation portée est identifié par un paramètre de la requête (dans la Soudure, c'estcid
), il n'est donc pas vrai qu'il se comporte comme une séance d'étendue de haricot. Si vous créez une nouvelle requête avec cette boîte de dialogue, une nouvelle conversation est lancée, même si l'ancien n'est pas encore terminé.Je pense que vous pouvez bénéficier de CDI de l'extension à créer votre propre champ d'application de sorte que vous pouvez mettre en œuvre le cadre et l'utilisation de la
@NormalScope
.AfterBeanDiscovery
après chaque bean appel@Observes
cet événement et ajouter votre contexte de la mise en œuvreContextual
pour obtenir votre bean par son nom deFacesContext
ViewRoot
Map
et le retourner après chaque appel ajax retourCreationalContext
si la fève nom de la première étape n'est pas trouvé à le créer dans leFacesContext
ViewRoot
Map
Pour une explication plus approfondie, je vous recommande ce lien : http://www.verborgh.be/articles/2010/01/06/porting-the-viewscoped-jsf-annotation-to-cdi/
Injecter de la conversation dans votre bean et dans le
@PostConstructor
méthode d'entamer la conversation si la conversation est transitoire.Et après la suppression de l'enregistrement à la fin de votre conversation et accédez à votre page de destination. Lorsque l'on commence une conversation. Voici un exemple
}
Il y a un projet qui tient un extentions à la Java EE pile caractéristiques: DeltaSpike. C'est une consolidation de Couture 3, Apache CODI. Au-dessus des autres, il comprend l' @ViewScoped en CDI. C'est un vieil article et maintenant il a atteint la version 1.3.0
Vous pouvez utiliser: