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

JSF Java Discussion :

Stateful et managed beans


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 51
    Par défaut Stateful et managed beans
    Bonjour bonjour,

    J'ai une application simple avec un bean session stateful, un managed bean et 4 jsp. Mon managed bean appelle la logique métier définie par le bean session. Lorsque ( dans le faces-config.xml ) je définie mon managed bean avec un scope session tout va pour le mieux, lorsque je le met en request j'ai une jolie exception à l'appel de mon stateful :
    "javax.ejb.EJBTransactionRolledbackException".

    Au départ, mon stateful était un stateless, donc il semblait logique que mon managed bean devait être en session. L'application réalise la reservation d'un billet d'avion au moyen de trois pages :
    -choix de la destination
    -choix de la date
    -choix du nombre de places

    Etant donné que la réservation doit contenir tous ces éléments, il m'apparut plus logique dans la partie métier de définir un bean stateful qui s'occuperait lui de stocker ces informations nécessaires à la réservation.

    Ma question à présent, est-on contraint à définir le scope d'un managed bean en session pour que celui ci accède correctement à mon stateful ? Car le problème, c'est que visiblement il réinstancie mon EJB à chaque appel ( injecté via @EJB ).

  2. #2
    Rédacteur
    Avatar de longbeach
    Profil pro
    Architecte de système d’information
    Inscrit en
    Avril 2003
    Messages
    943
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Avril 2003
    Messages : 943
    Par défaut
    un peu de code ? au cas où l'erreur vient de là.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 51
    Par défaut
    Bien entendu, le voici :

    L'EJB session :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    package service;
     
    import dao.ReservationDaoLocal;
    import entities.Destination;
    import entities.Disponibilite;
    import java.util.List;
    import javax.ejb.EJB;
    import javax.ejb.Stateful;
    import javax.ejb.TransactionAttribute;
    import javax.ejb.TransactionAttributeType;
     
    /**
     *
     * @author arnaud
     */
    @Stateful
    public class ReservationBean implements ReservationLocal {
     
        private Destination selectedDest;
     
        private Disponibilite selectedDisp;
     
        private Long nbPersonnes;
     
        /**
         * 
         * @param disp
         * @param nbPlaces
         */
        @TransactionAttribute(TransactionAttributeType.REQUIRED)
        public void reserve() {
            this.dao.reserve(this.selectedDisp, this.nbPersonnes);
        }
     
        /**
         * 
         * @return
         */
        public List<Destination> getAvailableDestinations() {
            return this.dao.getAvailableDestinations();
        }
     
        /**
         * 
         * @param id
         * @return
         */
        public Destination findDestination(Long id){
            return this.dao.findDestination(id);
        }
     
        /**
         * 
         * @param dest
         * @return
         */
        public List<Disponibilite> getDisponibilites() {
            return this.dao.getDisponibilites(this.selectedDest);
        }
     
        /**
         * 
         * @param id
         * @return
         */
        public Disponibilite findDisponibilite(Long id) {
            return this.dao.findDisponibilite(id);
        }
     
        /**
         *
         * @param disp
         */
        public void selectDisponibilite(Disponibilite disp){
            this.selectedDisp = disp;
        }
     
        /**
         *
         * @param dest
         */
        public void selectDestination(Destination dest){
            this.selectedDest = dest;
        }
     
        /**
         * 
         * @param nbPersonnes
         */
        public void selectNbPersonnes(Long nbPersonnes){
            this.nbPersonnes = nbPersonnes;
        }
     
        /**
         *
         * @return
         */
        public Disponibilite getSelectedDisp() {
            return this.selectedDisp;
        }
     
        /**
         *
         * @return
         */
        public Destination getSelectedDestination() {
            return this.selectedDest;
        }
     
        /**
         * 
         * @return
         */
        public Long getNbPersonnes(){
            return this.nbPersonnes;
        }
     
    }
    Le managed bean :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    package beans;
     
    import entities.Destination;
    import entities.Disponibilite;
    import java.util.List;
    import javax.ejb.EJB;
    import service.ReservationLocal;
     
    /**
     *
     * @author arnaud
     */
    public class Controller {
     
        @EJB
        private ReservationLocal bean;
     
        private String select;
     
        /**
         * 
         * @return
         */
        public String choseDestination(){
            Destination d = this.bean.findDestination(Long.valueOf(this.select));
            this.bean.selectDestination(d);
            return "page2";
        }
     
        /**
         * 
         * @return
         */
        public String choseDisponibilite(){
            Disponibilite d = this.bean.findDisponibilite(Long.valueOf(this.select));
            this.bean.selectDisponibilite(d);
            return "page3";
        }
     
        /**
         * 
         * @return
         */
        public String makeReservation(){
            this.bean.selectNbPersonnes(Long.valueOf(this.select));
            this.bean.reserve();
            return "page4";
        }
     
        /**
         *
         * @return
         */
        public List<Destination> getDestinations(){
            return this.bean.getAvailableDestinations();
        }
     
        /**
         * 
         * @return
         */
        public List<Disponibilite> getDisponibilites(){
            return this.bean.getDisponibilites();
        }
     
        /**
         *
         * @return
         */
        public String getSelect() {
            return select;
        }
     
        /**
         *
         * @param select
         */
        public void setSelect(String select) {
            this.select = select;
        }
     
        public Destination getSelectedDest(){
            return this.bean.getSelectedDestination();
        }
     
        public Disponibilite getSelectedDisp(){
            return this.bean.getSelectedDisp();
        }
     
        public Long getNbPlaces(){
            return this.bean.getNbPersonnes();
        }
     
    }
    Et un exemple de JSP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    <%-- 
        Document   : page2
        Created on : 21 févr. 2009, 13:27:35
        Author     : arnaud
    --%>
     
    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <%@taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
    <%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
    <f:view>
        <html>
            <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
                <title>JSP Page</title>
            </head>
            <body>
                 <body>
                <fieldset>
                    <legend>Choix de la date pour <h:outputText value="#{controller.selectedDest.name}" /> :</legend>
                    <h:form>
                        <h:selectOneListbox value="#{controller.select}">
                            <c:forEach var="dispo" items="#{controller.disponibilites}">
                                <f:selectItem itemLabel="#{dispo.jour}" itemValue="#{dispo.id}" />
     
                            </c:forEach>
     
                        </h:selectOneListbox>
                        <h:commandButton action="#{controller.choseDisponibilite}" value="valider">
                        </h:commandButton>
                    </h:form>
                </fieldset>
     
            </body>
            </body>
        </html>
    </f:view>
    edit: j'ajoute juste que ReservationDaoLocal entretient directement avec JPA et fournit les opérations de base dont j'ai besoin pour établir une réservation, donc beaucoup de méthodes sont simplement reproduites dans ReservationBean, en sachant que ReservationDaoBean ( qui implémente ReservationDaoLocal ) est un stateless.

  4. #4
    Rédacteur
    Avatar de longbeach
    Profil pro
    Architecte de système d’information
    Inscrit en
    Avril 2003
    Messages
    943
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Avril 2003
    Messages : 943
    Par défaut
    je sais pas, j'ai pas encore fait de l'injection d'EJB dans des managed beans JSF.
    Bon je pense que tu sais que request a une portée inférieure à celle de session mais ça n'explique pas le problème.

    ça doit être basique, si qqu'un a la réponse, ça serait cool qu'il réponde.

Discussions similaires

  1. JSF: Can't set managed bean property: 'Nom'.
    Par Laurent68 dans le forum JSF
    Réponses: 4
    Dernier message: 11/06/2009, 16h28
  2. Diffèrence Managed bean et backing bean
    Par BRAUKRIS dans le forum JSF
    Réponses: 2
    Dernier message: 25/11/2006, 07h49
  3. Réponses: 3
    Dernier message: 15/09/2006, 14h01
  4. utilisation d'un managed bean par un autre
    Par Romain93 dans le forum JSF
    Réponses: 6
    Dernier message: 28/07/2006, 10h29
  5. Réponses: 4
    Dernier message: 10/03/2006, 17h25

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