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:
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:
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:
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 :
Citation:
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 :-)