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 :

[JSF / PrettyFaces] L'action ne passe pas dans le constructeur du bean


Sujet :

JSF Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 93
    Points : 126
    Points
    126
    Par défaut [JSF / PrettyFaces] L'action ne passe pas dans le constructeur du bean
    Bonjour.

    J'essaye de développer une façon de logger les actions faites sur mon futur site.

    Pour ce faire j'ai un backing bean par page qui étend un bean général dans lequel se fait la log.

    Voici un exemple :

    Bean de la page d'accueil

    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
     
    import com.ocpsoft.pretty.faces.annotation.URLMapping;
    import com.ocpsoft.pretty.faces.annotation.URLMappings;
    import com.wsp.project.core.web.BeanPage;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.RequestScoped;
     
    @RequestScoped
    @ManagedBean(name = "beanPageHome")
    @URLMappings(mappings = {
        @URLMapping(id = "home", pattern = "/", viewId = "/home.xhtml"),
        @URLMapping(id = "home-link", pattern = "/accueil", viewId = "/home.xhtml")
    })
    public class BeanPageHome extends BeanPage {
     
        public BeanPageHome() {
            super();
        }
     
     
    }
    Bean général
    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
     
    package com.wsp.project.core.web;
     
    import com.ocpsoft.pretty.PrettyContext;
    import com.ocpsoft.pretty.faces.config.mapping.QueryParameter;
    import javax.faces.bean.ManagedProperty;
    import javax.faces.context.FacesContext;
    import javax.servlet.http.HttpServletRequest;
     
    public abstract class BeanPage {
     
        protected HttpServletRequest request;
        protected PrettyContext context;
        protected String prettyId, prettyPattern, prettyViewId;
        @ManagedProperty("beanSession")
        protected BeanSession session;
     
        public BeanPage() {
            request = (HttpServletRequest) (FacesContext.getCurrentInstance().getExternalContext().getRequest());
            context = PrettyContext.getCurrentInstance(request);
            prettyId = context.getCurrentMapping().getId();
            prettyPattern = context.getCurrentMapping().getPattern();
            prettyViewId = context.getCurrentMapping().getViewId();
            logPageAction();
        }
     
        private void logPageAction() {
            String mappingInfo = getUserIdentifier() + " - Request page with infos : ";
            mappingInfo += "[prettyId:" + prettyId + "]" + "[prettyPattern:" + prettyPattern + "]"
                    + "[prettyViewId:" + prettyViewId + "]";
     
            if (null != context.getCurrentMapping().getQueryParams()) {
                mappingInfo += "with params : ";
                for (QueryParameter qp : context.getCurrentMapping().getQueryParams()) {
                    mappingInfo += "[" + qp.getName() + ":" + qp.getValue() + "]";
                }
            }
     
            System.out.println(mappingInfo);
        }
     
     
        public String getUserIp() {
            return request.getHeader("X-FORWARDED-FOR");
        }
     
        public String getUserIdentifier() {
            return "User with session code : " + session.getUserUniqueSessionCode() + " and ip : " + getUserIp();
        }
     
        public BeanSession getSession() {
            return session;
        }
     
        public void setSession(BeanSession session) {
            this.session = session;
        }
    }
    et pour avoir la vue d'ensemble le bean de 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
     
    package com.wsp.project.core.web;
     
    import com.wsp.project.core.utils.Encryption;
    import java.util.UUID;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.SessionScoped;
     
    @SessionScoped
    @ManagedBean(name = "beanSession")
    public class BeanSession {
     
        private String userUniqueSessionCode;
     
        public BeanSession(){
            userUniqueSessionCode = Encryption.encryptSha256(UUID.randomUUID().toString());
        }
     
        public String getUserUniqueSessionCode() {
            return userUniqueSessionCode;
        }
     
     
    }
    Mon problème est le suivant : je passe bien dans mon BeanPageHome car j'ai ma redirection qui est faite... seulement je n'appelle pas le constructeur et donc je ne log rien.

    Si quelqu'un à une idée ?

    En vous remerciant à l'avance.
    Pour une bonne résolution :
    - N'hésitez pas à donner le maximum d'informations sur vos problèmes, ca vous fera gagner du temps en évitant les aller-retours.
    - Si vous utilisez maven, pensez à rajouter votre pom !

    --> Le meilleur code est celui qui concrétise ce qui a été posé et analysé sur le papier

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 93
    Points : 126
    Points
    126
    Par défaut
    Après de nombreuses recherches et tests, j'ai trouvé un moyen d'arriver à mes fins. Je vous partage mon code si jamais ça peut aider d'autres personnes. Mais avant voici l'explication que je me suis fais :

    En passant par prettyface, la classe est instancié uniquement si un mapping d'action est déclaré (ce qui explique pourquoi quand j'ai une balise @URLAction je passe dans toutes les strates de mes objets et dans aucune quand je n'en ai pas)

    Passer par un héritage en déclarant des @URLAction avec des phases précises renseignées n'est pas non plus viable. Il demande de faire une référence vers l'action à appeler dans la classe fille (chose que l'on ne sais pas dans la classe mère).

    Alors je me suis tourné vers les annotation @PostConstruct et @PreDestroy tout en renseignant une @URLAction minimale

    Voici le code

    Classe mere
    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
     
     
    import com.ocpsoft.pretty.PrettyContext;
    import com.ocpsoft.pretty.faces.config.mapping.QueryParameter;
    import java.util.Calendar;
    import java.util.GregorianCalendar;
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    import javax.faces.context.FacesContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
     
    public abstract class BeanPage {
     
        protected String prettyId, prettyPattern, prettyViewId;
        protected Calendar startActionCalendar, endActionCalendar;
        protected HttpServletRequest request;
        protected HttpSession session;
        protected PrettyContext context;
     
        @PostConstruct
        public void postConstruct() {
            startActionCalendar = new GregorianCalendar();
            request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
            session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
            context = PrettyContext.getCurrentInstance(request);
        }
     
        @PreDestroy
        public void preDestroy() {
     
            prettyId = context.getCurrentMapping().getId();
            prettyPattern = context.getCurrentMapping().getPattern();
            prettyViewId = context.getCurrentMapping().getViewId();
            String mappingInfo;
     
            if (null != session) {
                mappingInfo = "User : [id] " + session.getId() + " [ip] " + request.getRemoteAddr();
            } else {
                mappingInfo = "User : [id] NEW USER [ip] " + request.getRemoteAddr();
            }
     
            mappingInfo += " - Infos : [prettyId] " + prettyId + " [prettyPattern] " + prettyPattern + " [prettyViewId] " + prettyViewId;
     
            if (null != context.getCurrentMapping().getQueryParams()
                    && context.getCurrentMapping().getQueryParams().size() > 0) {
                mappingInfo += "with params : ";
                for (QueryParameter qp : context.getCurrentMapping().getQueryParams()) {
                    mappingInfo += "[" + qp.getName() + "] " + qp.getValue() + " ]";
                }
            }
     
            mappingInfo += " - Execution time " + (new GregorianCalendar().getTimeInMillis() - startActionCalendar.getTimeInMillis()) + " ms";
            System.out.println(mappingInfo);
        }
    }
    Classe fille
    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
     
    import com.ocpsoft.pretty.faces.annotation.URLAction;
    import com.ocpsoft.pretty.faces.annotation.URLMapping;
    import com.ocpsoft.pretty.faces.annotation.URLMappings;
    import com.wsp.project.core.web.BeanPage;
    import java.io.Serializable;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.RequestScoped;
     
    @RequestScoped
    @ManagedBean(name = "beanPageHome")
    @URLMappings(mappings = {
        @URLMapping(id = "home", pattern = "/", viewId = "/home.xhtml"),
        @URLMapping(id = "home-link", pattern = "/accueil", viewId = "/home.xhtml")})
    public class BeanPageHome extends BeanPage implements Serializable {
     
        @URLAction
        public void urlActionPage() {}
     
    }
    Pour une bonne résolution :
    - N'hésitez pas à donner le maximum d'informations sur vos problèmes, ca vous fera gagner du temps en évitant les aller-retours.
    - Si vous utilisez maven, pensez à rajouter votre pom !

    --> Le meilleur code est celui qui concrétise ce qui a été posé et analysé sur le papier

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

Discussions similaires

  1. VBA ne passe pas dans BO xi-r2
    Par faressam dans le forum Administration-Migration
    Réponses: 10
    Dernier message: 27/06/2008, 14h10
  2. Ma requête SQL SELECT ne passe pas dans next()
    Par Somato dans le forum Bases de données
    Réponses: 17
    Dernier message: 02/06/2008, 15h45
  3. pourquoi je ne passe pas dans mon action
    Par fk04 dans le forum Struts 1
    Réponses: 5
    Dernier message: 03/10/2007, 21h20
  4. Ctrl -] ne passe pas dans une console avec vim
    Par Celelibi dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 10/03/2006, 13h35
  5. Réponses: 8
    Dernier message: 26/10/2005, 03h52

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