Bonjour,

je cherche à connecter des pages JSF à des EJB. Cependant, je n'y arrive pas.

J'ai écrit un bean qui, pour une propriété précise, va chercher des données via un EJB (session, stateless) lorsque sa valeur est null. Or un appel à cette méthode plante immédiatement ma page.

J'obtiens les erreurs suivantes :

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
11:49:39,390 ERROR [UIComponentTagUtils] Component javax.faces.component.UISelectItems is no ValueHolder, cannot set value.
11:49:39,390 WARN  [/pcbw] /pcbw/choixMedecin.faces: 
javax.faces.FacesException: Value binding 'null'of UISelectItems with component-path {Component-Path : [Class: javax.faces.component.UIViewRoot,ViewId: /choixMedecin.jsp][Class: javax.faces.component.html.HtmlSelectOneMenu,Id: _id0][Class: javax.faces.component.UISelectItems,Id: _id1]} does not reference an Object of type SelectItem, SelectItem[], Collection or Map but of type : null
	at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:421)
	at org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:234)
	at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:352)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:107)
	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:428)
	at org.mortbay.jetty.servlet.WebApplicationHandler$CachedChain.doFilter(WebApplicationHandler.java:830)
	at org.mortbay.jetty.servlet.jsr77.Jsr77Filter.doFilter(Jsr77Filter.java:77)
	at org.mortbay.jetty.servlet.WebApplicationHandler$CachedChain.doFilter(WebApplicationHandler.java:821)
	at org.mortbay.jetty.servlet.WebApplicationHandler.dispatch(WebApplicationHandler.java:471)
	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:568)
	at org.mortbay.http.HttpContext.handle(HttpContext.java:1530)
	at org.mortbay.jetty.servlet.WebApplicationContext.handle(WebApplicationContext.java:633)
	at org.mortbay.http.HttpContext.handle(HttpContext.java:1482)
	at org.mortbay.http.HttpServer.service(HttpServer.java:909)
	at org.jboss.jetty.Jetty.service(Jetty.java:456)
	at org.mortbay.http.HttpConnection.service(HttpConnection.java:816)
	at org.mortbay.http.HttpConnection.handleNext(HttpConnection.java:982)
	at org.mortbay.http.HttpConnection.handle(HttpConnection.java:833)
	at org.mortbay.http.SocketListener.handleConnection(SocketListener.java:244)
	at org.mortbay.util.ThreadedServer.handle(ThreadedServer.java:357)
	at org.mortbay.util.ThreadPool$PoolThread.run(ThreadPool.java:534)
Caused by: org.apache.jasper.JasperException: Value binding 'null'of UISelectItems with component-path {Component-Path : [Class: javax.faces.component.UIViewRoot,ViewId: /choixMedecin.jsp][Class: javax.faces.component.html.HtmlSelectOneMenu,Id: _id0][Class: javax.faces.component.UISelectItems,Id: _id1]} does not reference an Object of type SelectItem, SelectItem[], Collection or Map but of type : null
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:372)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:428)
	at org.mortbay.jetty.servlet.WebApplicationHandler$CachedChain.doFilter(WebApplicationHandler.java:830)
	at org.mortbay.jetty.servlet.jsr77.Jsr77Filter.doFilter(Jsr77Filter.java:77)
	at org.mortbay.jetty.servlet.WebApplicationHandler$CachedChain.doFilter(WebApplicationHandler.java:821)
	at org.mortbay.jetty.servlet.WebApplicationHandler.dispatch(WebApplicationHandler.java:471)
	at org.mortbay.jetty.servlet.Dispatcher.dispatch(Dispatcher.java:286)
	at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:171)
	at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:415)
	... 20 more
Voici mon code associé à l'erreur :
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
public class MonBean {
  private Collection dispensateurs = new ArrayList();
  private Collection dispensateursData = new ArrayList();
  public Collection getDispensateurs() {
    log.debug("entering getDispensateurs()");
    if (dispensateurs.size() == 0) {
      Collection dispensateursData = getDispensateursData();
      Collection tmpDispensateurs = new ArrayList();
      if (dispensateursData != null) {
        log.debug("Size of dispensateursData : " + dispensateursData.size());
        for (Iterator it = dispensateursData.iterator(); it.hasNext();) {
          DispensateurObject disp = (DispensateurObject) it.next();
          SelectItem si = new SelectItem(disp, disp.getNom() + ", "
              + disp.getPrenom());
          tmpDispensateurs.add(si);
        }
        dispensateurs = tmpDispensateurs;
      }
      else
      {
        log.debug("dispensateursData is empty.");
      }
    }
    log.debug("leaving getDispensateurs()");
    return dispensateurs;
  } // fin getDispensateurs
  public Collection getDispensateursData() {
    if (dispensateursData == null) {
      try {
        dispensateursData = MonEJB.getInstance().getDispensateurs();
        if (log.isDebugEnabled())
          log.debug(dispensateursData.size() + " dispensateurs");
      } catch (ServiceException e) {
        log.warn("Impossible de charger les dispensateurs", e);
        dispensateursData = null;
      }
    }
    return dispensateursData;
  } // fin getDispensateursData
} // fin class
getDispensateurs étant un cache pour getDispensateursData.

Le plus étrange étant qu'aucun de mes messages de log n'est affiché alors que lors d'appels à d'autres méthodes, ils sont correctement affichés (niveau debug). J'ai donc l'impression que la méthode getDispensateurs() n'est jamais appelée.