IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Seam Java Discussion :

[débutant] aide pour l'utilisation de conversations


Sujet :

Seam Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut [débutant] aide pour l'utilisation de conversations
    Bonjour,

    Je travaille avec Jboss 4.2.3, Seam 2.1.1 et jsf 1.2 et richfaces 3.2.1

    J'ai un formulaire de saisie avec des comboBox. Quand je sélectionne une valeur dans un, ça doit réduire le champ des valeurs des suivants.

    Pour ça, dans la page j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a4j:support event="onchange" reRender="maComboBox" />
    Les valeurs de ma combobox sont données par un service qui génère les listes de SelectItem depuis les listes d'entités que je souhaiterais garder en cache, pour pouvoir faire les liens id/entité sans passer par ma base.

    Mon idée, pour réaliser cette sorte de cache des listes d'entités, était de faire de ce service une conversation : une par utilisateur, qui dure jusqu'à ce qu'on fasse un submit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @Name("selectItemGenerator")
    @Stateful
    @Scope(ScopeType.CONVERSATION)
    @TransactionAttribute
    public class SelectItemGeneratorBO implements SelectItemGeneratorBS
    J'ai rajouté le transactionAttribute pour le lazy loading.

    j'ai une fonction begin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @Begin
    public void init() {
    et une fonction end
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @End
    @Remove
    public void finish() {
    et j'ai lu dans la doc de seam (mais j'ai peut être mal compris) que pour s'assurer que la conversation commence à l'affichage de la page, il fallait ajouter dans pages.xml ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <page view-id="mapage.xhtml" action="#{selectItemGenerator.init()}"/>
    Mon problème, c'est qu'à l'affichage de la page, tout va bien, mais quand je sélectionne une valeur qui va appeller le reRender d'un élément, j'ai ce message d'erreur :
    javax.el.ELException: javax.ejb.EJBTransactionRolledbackException: begin method invoked from a long-running conversation, try using @Begin(join=true) on method: init
    Selon moi, rajouter un (join=true) ne résoudras pas le problème puisqu'il y aura très probablement des conflits au niveau des sessions hibernate, et donc j'aimerais savoir :
    1) est ce que mon idée de conversation est bonne ou je me suis totalement planté ?
    2) si oui, qu'est ce que j'ai fait de mal ? (probablement le pages.xml, qui me semble louche)
    3) Quand est ce que je suis sensé appeller le begin et le end en réalité ?


    D'avance, merci beaucoup.
    Venez partager vos expériences au sein d'un projet sur slicesofit, agile & amélioration continue

  2. #2
    Membre éclairé

    Inscrit en
    Février 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 122
    Points : 659
    Points
    659
    Par défaut
    Déjà n'utilise pas de SelectItem, fait des listes d'entity et place un <s:convertEntity /> dans ton selectItem sur la JSF tu vas gagner du temps et Seam fera le boulot proprement.

    Ensuite le Begin et le End tu les utilises que si tu veux vraiment maîtriser ta conversation : si tu met un objet en conversation, la conversation va démarrer pour l'utilisateur au premier appel, et finir quand l'utilisateur cessera d'accéder (réferencer) à l'objet c'est une explication simplifiée et schématique bien sur.

    Quand au transaction attribute, il faut le paramétrer regarde dans la doc.
    Tu auras pas de problèmes de conflits si tu met un join = true : la conversation n'est pas dependante de la session hibernate, tu dois voir la conversation comme un contexte restreint dans la session HTTP, une conversation va correspondre à un ensemble de tâches liées entre elle. Les Traitement de ta liste par exemple.

    Pour revenir au begin il y a différentes façon de l'utiliser : soit tu veux l'utiliser pour joindre une conversation longue et là tu ajoute le join = true qui joindra la conversation courante si elle existe.
    Soit tu veux limiter ta conversation c'est à dire pas uniquement du premier accès à ton objet jusqu'au dernier : par exemple initialisation d'un process ( @Begin) methode métier et finalisation du process ( @End)
    globalement vu ce que tu as l'air de vouloir faire pour moi tu n'as ni besoin de begin ni de end là ...

    D'ailleurs ton EJB est stateful par définition Seam charge les EJB Stateful en conversation si ce n'est pas précisé.
    Fait gaffe à ce que tu fais à jouer sur les TransactionAttribute tu risque de faire des bétises si tu maitrises pas les concepts de transaction EJB.

    J'ai pas l'intégralité de ton code donc impossible d'en etre sur mais pour moi d'après ce que dis l'exception tu as fait une bétise avec la transaction EJB

    En bref la conversation c'est juste une petite session HTTP dont tu défini toi même le départ et la fin et qui résout entre autre les problèmes d'accès concurrent aux objets dans la session lors d'un accès au site par plusieurs onglets dans le navigateur.

    Voilà je sais pas si j'ai été très clair n'hésite pas si tu as besoin

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    1) j'ai essayé de passer par les entités et s:convertEntity, mais ça n'a pas marché du premier coup et on ne me laisse malheuresement pas le temps d'apprendre à me servir de tout ça. Du coup je traine toujours mes selectitems. On verra ça lors d'une évol :/

    2) Après avoir tout détruit, j'ai découvert que j'avais une boucle infinie de débutant dans un petit bout de code, du coup, forcément, je n'avais jamais la main sur la session hibernate, et donc ma session seam plantait.

    3) Maintenant j'ai un autre probleme avec cette form, mais je vais en parler dans un autre thread pour etre plus lisible.

    En tout cas, merci pour ta réponse.
    Venez partager vos expériences au sein d'un projet sur slicesofit, agile & amélioration continue

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XHTML] [Débutant] Aide pour navigation avec cadres
    Par calogerogigante dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 18/06/2006, 23h43
  2. [VBA-E][débutant]aide pour macro sous excel
    Par julyBL dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 09/06/2006, 22h42
  3. [SWFTools] Aide pour l'utiliser
    Par fredhali2000 dans le forum Flash
    Réponses: 1
    Dernier message: 10/02/2006, 16h19
  4. Besoin d'aide pour l'utilisation de devcpp.
    Par argon dans le forum Dev-C++
    Réponses: 10
    Dernier message: 24/01/2006, 20h24
  5. [débutant] Aide pour mettre une FOREIGN KEY sur une table
    Par cauldron dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/11/2004, 17h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo