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 :

Initialisation d'un managed bean


Sujet :

JSF Java

  1. #1
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 8
    Par défaut Initialisation d'un managed bean
    Bonjour à tous,

    J'avoue débuter avec JSF et je rencontres quelques soucis. Avant de vous expliquer le souci en question je vais vous expliquer le contexte.

    J'ai deux classes persistées avec Hibernate :
    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
    public class A{
     private String chaineDansA;
     
     public String getChaineDansA() {
       return this.chaineDansA;
     }
     public void setChaineDansA(String chaineDansA) {
       this.chaineDansA = chaineDansA;
     }
    }
     
    public class B{
     private String chaineDansB;
     private A objetA;
     
    // Accesseurs/mutateurs associé
    //[...]
    }
    Coté front maintenant, j'ai une page de recherche, géré par un managed-bean déclaré comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <managed-bean>
     <description>
      Bean gérant la recherche d un B
     </description>
     <managed-bean-name>rechercheBManagedBean</managed-bean-name>
     <managed-bean-class>
      fr.mon.package.backingbean.RechercheBManagedBean
     </managed-bean-class>
     <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    Le but de ce backing bean est de pouvoir faire une recherche de B dans un formulaire en proposant par exemple une recherche sur le critere chaineDansA du objetA contenu dans B.
    Voici le code de mon backing 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
    public class RechercheBManagedBean{
     private B b = new B();
     List<B> resultats;
     
     public B getB(){
      return this.b;
     }
     
     public void setB(B b){
      this.b=b;
     }
     
     public List<B> getResultats() {
      return this.resultats;
     }
     
     public void setResultats(List<B> resultats) {
      this.resultats = resultats;
     }
     
     public String rechercher() {
     String result = "resultat"
     // Récupération du service factory :
     ServiceFactory sf = (ServiceFactory) getBean("bServiceFactory");
     // Appel du service de recherche
     List<B> res = sf.getServiceB().findBByCriteria(this.getB);
     this.setResultats(res);
     return result;
     }
    }
    Maintenant dans ma page de recherche si je fais une zone de saisie qui demande "chaineDansB" (rechercheBManagedBean.b.chaineDansB), pas de problème cela fonctionne. Si je fais maintenant une zone de saisie qui demande chaine dans A (rechercheBManagedBean.b.a.chaineDansA), j'ai une exception qui est levée :

    java.lang.ExceptionInInitializerError
    at com.sun.el.lang.ELSupport.coerceToType(Unknown Source)
    at com.sun.el.parser.AstValue.setValue(Unknown Source)
    at com.sun.el.ValueExpressionImpl.setValue(Unknown Source)
    at com.sun.facelets.el.TagValueExpression.setValue(TagValueExpression.java:93)
    at com.sun.facelets.el.LegacyValueBinding.setValue(LegacyValueBinding.java:68)
    at javax.faces.component.UIInput.updateModel(UIInput.java:270)
    at javax.faces.component.UIInput.processUpdates(UIInput.java:207)
    at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:648)
    at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:648)
    at javax.faces.component.UIForm.processUpdates(UIForm.java:90)
    at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:648)
    at javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:160)
    at org.ajax4jsf.component.AjaxViewRoot.access$101(AjaxViewRoot.java:57)
    at org.ajax4jsf.component.AjaxViewRoot$2.invokeRoot(AjaxViewRoot.java:291)
    at org.ajax4jsf.context.JsfOneOneInvoker.invokeOnRegionOrRoot(JsfOneOneInvoker.java:56)
    at org.ajax4jsf.context.AjaxContextImpl.invokeOnRegionOrRoot(AjaxContextImpl.java:173)
    at org.ajax4jsf.component.AjaxViewRoot.processUpdates(AjaxViewRoot.java:305)
    at org.apache.myfaces.lifecycle.UpdateModelValuesExecutor.execute(UpdateModelValuesExecutor.java:33)
    at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:95)
    at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:139)
    at org.apache.myfaces.webapp.MyFacesServlet.service(MyFacesServlet.java:77)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
    at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
    at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
    at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:265)
    at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107)
    at org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
    at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    at fr.mediapost.fwk.security.acegi.util.JSFExceptionTranslationFilter.doFilter(JSFExceptionTranslationFilter.java:48)
    at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:110)
    at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
    at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    at org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142)
    at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    at org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:81)
    at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:229)
    at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:286)
    at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    at org.acegisecurity.securechannel.ChannelProcessingFilter.doFilter(ChannelProcessingFilter.java:138)
    at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
    at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:149)
    at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
    at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:147)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
    at java.lang.Thread.run(Thread.java:595)
    D'après moi ce problème est due au fait que l'objetA dans B n'est jamais initialisé, du coup au moment ou il tente de faire un setChaineDansA() sur objetA(), il tente de le faire sur un null...
    Le problème ne se pose pas lorsque je mets comme zone de saisie chaineDansB car, comme vous l'aurez remarqué, dans mon managed bean, je déclare B en l'initialisant (private B b = new B();).

    J'en viens donc maintenant a ma question : comment faire en sorte avec JSF pour initialiser les attributs d'un bean et toutes ses dependances lorsque celle-ci sont nécessaire ?
    J'ai bien pensé a rajouter un constructeur dans mon managed bean qui se chargerait d'initialiser mon B, et tous les attributs de mon B, et tous les attributs des attributs de mon B, etc.... mais je trouve ca moche.
    J'ai bien pensé également a créer un constructeur dans chaque bean (A et B) qui se charge d'initialiser ses propres attributs, mais ca ne me semble pas une bonne solution quand on utilise Spring/Hibernate.

    Avez vous des résponses, des suggestions, des pistes de reflexions, etc ?

    Cordialement,
    Jérôme.

    PS : je remmercie tous ceux qui auront eu le courage de me lire jusqu'au bout :-)

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Cette exception se produit quand une erreur se produit durant le "static initializer" d'un classe. Note bien que je parle du niveau classe, pas du niveau instance. Donc ton erreur se produit dans une ligne qui a soit la forme


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (private|public|protected) static <type> <nom> = <code d'initialization de la propriété statique>;
    Soit la forme

    Note que le problème n'est fort probablement pas lié à JSF mais plutot à une de tes classes qui rate son initialization statique. Et comme c'est au niveau statique, utiliser les managed-property de JSF n'aura aucune utilité puisque çà interviens après l'instanciation.
    D'après la doc Java, une ExceptionInInitializerError dispose d'une cause (getCause()). Donc si tu va dans les logs de ton serveur, où normalement a eu lieu le printStackTrace(), tu devrais avoir la série des "caused by" qui t'informe des raison. Sino tu va devoir créer un fichier error.jsp, configurer ton web.xml pour gerer les erreurs en les envoyant dessus, et dans le jsp récupérer l'exception pour la transmettre (Note, c'est une error, pas une exception -> peut de chance que çà arrive jusqu'au error.jsp qui normalement ne traite que des exception).

Discussions similaires

  1. initialiser tous les managed bean session
    Par azassma dans le forum JSF
    Réponses: 4
    Dernier message: 27/07/2012, 13h02
  2. Problème à l'initialisation d'un managed-bean
    Par fredlev dans le forum JSF
    Réponses: 2
    Dernier message: 04/07/2007, 13h34
  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