ma servlet ne catch pas une exception lancée par mon EJB

ma servlet ne catch pas une exception lancée par mon EJB - Java - Programmation

Marsh Posté le 21-03-2006 à 16:54:39    

Bonjour à tous,
 
Je travaille sur ubuntu, le serveur que j'utilise est jboss 4.0.4RC1
 
J'ai créer une classe d'exception "InvalidData" qui hérite de "Exception". Dans une méthode de mon EJB je lance l'exception InvalidData, mais je ne parviens pas à attraper cette exception dans la servlet qui fait l'appel.
 
Ce problème survient uniquement lorsque je fais tourner mon application sur un serveur se trouvant sur une autre machine. Lorsque je test sur mon serveur jboss en local, je n'ai aucun problème.
 
Est ce que quelqu'un a déjà rencontrer ce genre de problème? Est-ce que ce serais un problème de configuration du serveur?
 
D'avance merci.
 
A bientot

Reply

Marsh Posté le 21-03-2006 à 16:54:39   

Reply

Marsh Posté le 21-03-2006 à 21:08:45    

On peut voir comment la servlet appelle la méthode en question ?


---------------
Commons Configuration - http://jakarta.apache.org/commons/configuration
Reply

Marsh Posté le 21-03-2006 à 21:24:54    

et est ce qu'on peut voir la stacktrace de l'exception en question ?


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 22-03-2006 à 09:03:54    

Smanux a écrit :

On peut voir comment la servlet appelle la méthode en question ?


 
Pour expliquer un peu le contexte : La méthode reserverRessource est une méthode de mon EJB session "FacadeBean". facadeL est ici l'interface locale de ce bean. La méthode reserverRessource permet de réserver une ressource(= un employé) pour un projet. Il y a donc une date de début et une date de fin. Dans la méthode reserverRessource il y a vérification que la date de fin soit postérieure à la date de début. Si ce n'est pas le cas je fais : throw new InvalidDataException("La date de début doit être antérieure à la date de fin du projet" );
Voici le code de la servlet :  
                        try{
                                FacadeLocal facadeL;
                                System.out.println("avant reservation" );
                                facadeL.reserverRess(new Date(),auteurSN,strEmpSN,strClientSN,dateDeb.getTime(),dateFin.getTime(),nbJours,prixJour,proba,'V',strCommentaire);
                                System.out.println("apres reservation" );
                                resp.sendRedirect("ComputePipeSvt?auteurSN="+auteurSN+"&msg=Ressource réservée!" );
                        }
                        catch(InvalidDataException ex)
                        {
                               System.out.println("ds le catch de invalidData" );
                                //code de trt de l'exception
                         }
 
Et voici la stacktrace :  
 
08:45:10,551 INFO  [STDOUT] avant reservation
08:45:10,572 INFO  [STDOUT] avant lancement exception invalidData
08:45:10,573 ERROR [LogInterceptor] EJBException in method: public abstract void pipeline.interfaces.FacadeLocal.reserverRess(java.util.Date,java.lang.String,java.lang.String,java.lang.String,java.util.Date,java.util.Date,int,float,int,char,java.lang.String) throws pipeline.MyExceptions.RessourceAlreadyBooked,pipeline.MyExceptions.InvalidDataException:
pipeline.MyExceptions.InvalidDataException: La date de début doit être antérieure à la date de fin du projet
        at pipeline.ejb.FacadeBean.verifDates(FacadeBean.java:169)
        at pipeline.ejb.FacadeBean.reserverRess(FacadeBean.java:125)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.jboss.invocation.Invocation.performCall(Invocation.java:359)
        at org.jboss.ejb.StatelessSessionContainer$ContainerInterceptor.invoke(StatelessSessionContainer.java:228)
        at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:158)
        at org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor.invoke(StatelessSessionInstanceInterceptor.java:169)
        at org.jboss.webservice.server.ServiceEndpointInterceptor.invoke(ServiceEndpointInterceptor.java:71)
        at org.jboss.ejb.plugins.CallValidationInterceptor.invoke(CallValidationInterceptor.java:63)
        at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:121)
        at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:350)
        at org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:181)
        at org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java:168)
        at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:206)
        at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke(ProxyFactoryFinderInterceptor.java:136)
        at org.jboss.ejb.SessionContainer.internalInvoke(SessionContainer.java:643)
        at org.jboss.ejb.Container.invoke(Container.java:917)
        at org.jboss.ejb.plugins.local.BaseLocalProxyFactory.invoke(BaseLocalProxyFactory.java:430)
        at org.jboss.ejb.plugins.local.StatelessSessionProxy.invoke(StatelessSessionProxy.java:103)
        at $Proxy67.reserverRess(Unknown Source)
        at pipeline.web.BookServlet.doPost(BookServlet.java:235)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
        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.jboss.web.tomcat.security.CustomPrincipalValve.invoke(CustomPrincipalValve.java:54)
        at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:174)
        at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
        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:868)
        at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:663)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
        at java.lang.Thread.run(Unknown Source)
08:45:10,578 ERROR [[BookServlet]] Servlet.service() for servlet BookServlet threw exception
pipeline.MyExceptions.InvalidDataException: La date de début doit être antérieure à la date de fin du projet
        at pipeline.ejb.FacadeBean.verifDates(FacadeBean.java:169)
        at pipeline.ejb.FacadeBean.reserverRess(FacadeBean.java:125)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.jboss.invocation.Invocation.performCall(Invocation.java:359)
        at org.jboss.ejb.StatelessSessionContainer$ContainerInterceptor.invoke(StatelessSessionContainer.java:228)
        at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:158)
        at org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor.invoke(StatelessSessionInstanceInterceptor.java:169)
        at org.jboss.webservice.server.ServiceEndpointInterceptor.invoke(ServiceEndpointInterceptor.java:71)
        at org.jboss.ejb.plugins.CallValidationInterceptor.invoke(CallValidationInterceptor.java:63)
        at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:121)
        at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:350)
        at org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:181)
        at org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java:168)
        at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:206)
        at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke(ProxyFactoryFinderInterceptor.java:136)
        at org.jboss.ejb.SessionContainer.internalInvoke(SessionContainer.java:643)
        at org.jboss.ejb.Container.invoke(Container.java:917)
        at org.jboss.ejb.plugins.local.BaseLocalProxyFactory.invoke(BaseLocalProxyFactory.java:430)
        at org.jboss.ejb.plugins.local.StatelessSessionProxy.invoke(StatelessSessionProxy.java:103)
        at $Proxy67.reserverRess(Unknown Source)
        at pipeline.web.BookServlet.doPost(BookServlet.java:235)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
        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.jboss.web.tomcat.security.CustomPrincipalValve.invoke(CustomPrincipalValve.java:54)
        at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:174)
        at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
        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:868)
        at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:663)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
        at java.lang.Thread.run(Unknown Source)
 
 
Merci beaucoup pour votre aide.
 
A bientôt

Reply

Marsh Posté le 22-03-2006 à 09:07:33    

visiblement, l'appel qui génère l'exception est à la ligne 235 de la servlet BookServlet. C'est bien seule là qui est dans le catch ?


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 22-03-2006 à 09:17:24    

benou a écrit :

visiblement, l'appel qui génère l'exception est à la ligne 235 de la servlet BookServlet. C'est bien seule là qui est dans le catch ?


 
 
la ligne 235 de BookServlet correspond à l'appel de reserverRessource(..)

Reply

Marsh Posté le 22-03-2006 à 12:56:57    

Fais un catch(Throwable t) pour ratisser plus large, t'as peut être pas importé la bonne exception ?


---------------
Commons Configuration - http://jakarta.apache.org/commons/configuration
Reply

Marsh Posté le 22-03-2006 à 13:33:38    

S'il fait un appel a son ejb en remote, il est en train de manger une RemoteException ou une RuntimeException que ce crétin de jboss aurait forgée lui-même.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 22-03-2006 à 13:34:34    

et tu l'instancierais pas un peu, ton ejb, aussi, hein, ptet, au hasard, ça pourrait aider, non ? [:mlc]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 22-03-2006 à 13:45:15    

the real moins moins a écrit :

S'il fait un appel a son ejb en remote, il est en train de manger une RemoteException ou une RuntimeException que ce crétin de jboss aurait forgée lui-même.


 
hum hum, je l'ai instancier, je ne l'ai pas mis dans cette petite partie de code

Reply

Marsh Posté le 22-03-2006 à 13:45:15   

Reply

Marsh Posté le 22-03-2006 à 13:50:06    

l'appel a l'ejb est local. Servlet et EJB se trouve sur la meme machine. J'ai un truc très bizard qui se produit :  
 
J'ai ajouté un catch(Exception exc) après le catch InvalidDataException. Dans le catch Exception je fais  
 
System.out.println("type de l exception levée : "+exc.getClass());
 
Et devinez ce qu'il m'affiche?  
pipeline.MyExceptions.InvalidDataException
 
Si quelqu'un y comprends quelque chose. Merci de m'éclairer!!

Reply

Marsh Posté le 22-03-2006 à 13:52:43    

Nibuzer a écrit :

Ce problème survient uniquement lorsque je fais tourner mon application sur un serveur se trouvant sur une autre machine. Lorsque je test sur mon serveur jboss en local, je n'ai aucun problème.


 

Nibuzer a écrit :

l'appel a l'ejb est local. Servlet et EJB se trouve sur la meme machine.


 
faudrait savoir  ...


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 22-03-2006 à 13:57:13    

Affiche l'identité du classloader de l'exception aussi, et compare le avec celui de ta servlet.


---------------
Commons Configuration - http://jakarta.apache.org/commons/configuration
Reply

Marsh Posté le 22-03-2006 à 14:08:47    

the real moins moins a écrit :

faudrait savoir  ...


Je crois qu'on s'est mal compris ou alors j'explique vraiment comme un pied.
 
J'ai un unfichier Pipeline.ear qui contient un *.war qui contient ma servlet et un *.jar qui contient mon EJB.
 
J'ai installé Jboss application server sur une machine tournant sous Debian, Cette machine est ma machine de test! J'ai également installé jboss server sur ma machine de developpement (qui tourne sous ubuntu). J'ai effectué tous mes test en local, et je n'ai eu aucun problème, les exceptions lancées par l'ejb étaient bien catchées par la servlet comme je le voulais.
 
Ensuite j'ai voulu rendre disponible l'application et j'ai copier mon *.ear sur le serveur jboss de la machine debian.  
Lorsque je tente d'accéder à distance à l'application qui se trouve sur la machine debian... j'ai l'exception invalidDataException qui se produit et qui n'est pas catchée comme elle devrait l'être par la servlet. La stacktrace que je vous ai montré vient du log de mon serveur sur debian. Puisque c est la servlet qui catch l'exception et que la servlet et l'EJB se trouve tous les deux sur la machine debian. Je ne vois pas comment je pourrais avoir une remoteException entre les deux
 
est ce que c'est plus clair?

Reply

Marsh Posté le 22-03-2006 à 14:25:57    

Smanux a écrit :

Affiche l'identité du classloader de l'exception aussi, et compare le avec celui de ta servlet.


 
donc j'ai fait dans le code de la servlet  :  
            System.out.println("classloadre de la servlet : "+this.getClass().getClassLoader());
et dans le catch Exception :  
 
        catch(Exception exc)
        {
                System.out.println("classLoader de l'exception : "+exc.getClass().getClassLoader());
                System.out.println("type de l'exception lancée : "+exc.getClass());
        }
 
et voila les résultats que j'ai :  
 
14:20:12,381 INFO  [STDOUT] classloadre de la servlet : WebappClassLoader
  delegate: false
  repositories:
    /WEB-INF/classes/
----------> Parent Classloader:
java.net.FactoryURLClassLoader@8d5485
14:20:12,382 INFO  [STDOUT] avant reservation
14:20:12,409 INFO  [STDOUT] avant lancement exception invalidData
14:20:12,413 INFO  [STDOUT] classLoader de l'exception : org.jboss.mx.loading.UnifiedClassLoader3@1ab7626{ url=file:/home/windu/jboss-4.0.4RC1/server/default/tmp/deploy/tmp32142Pipeline.ear ,addedOrder=63}
14:20:12,413 INFO  [STDOUT] type de l'exception lanc\uffffe : class pipeline.MyExceptions.InvalidDataException
 
 
C'est bien cela que tu voulais??

Reply

Marsh Posté le 22-03-2006 à 16:14:45    

avec quel JAVA je paut faire la compression de la vidéo

Reply

Marsh Posté le 22-03-2006 à 16:37:53    

Oui c'est bien ce que je voulais, je me demande si ce n'est pas un problème lié aux classloaders. L'exception de ton EJB venant d'un autre classloader, elle n'est pas "compatible" avec la classe de même nom qualifié que connait ta servlet. Si tu essayais de caster l'exception dans le catch (Exception) en InvalidDataException je parie que tu aurais une ClassCastException.


---------------
Commons Configuration - http://jakarta.apache.org/commons/configuration
Reply

Marsh Posté le 23-03-2006 à 09:21:27    

Smanux a écrit :


Oui c'est bien ce que je voulais, je me demande si ce n'est pas un problème lié aux classloaders. L'exception de ton EJB venant d'un autre classloader, elle n'est pas "compatible" avec la classe de même nom qualifié que connait ta servlet. Si tu essayais de caster l'exception dans le catch (Exception) en InvalidDataException je parie que tu aurais une ClassCastException.


 
 
je ne peux pas faire un catch dans un autre, j'ai une erreur de compilation. Est ce que tu connais une solution à ce problème?
 
Mais j'ai quelque chose d'étrange, encore une fois, qui se produit. Maintenant meme en local la servlet ne catch pas l'exception. Par contre j'ai ecrit une toute petite application qui lance une exception et elle est catchée que ce soit sur le serveur distant ou le serveur local. Je pensais que le problème venait de la manière de déployer l'application (deploy to... avec le plugin eclipse jboss ide, ou copier le ear dans le repertoire deploy de jboss) mais apparemment ce n'est pas ca. Je suis perplexe!!

Reply

Marsh Posté le 23-03-2006 à 10:23:19    

Je pense que tu as raison, le problème viendrait de la. J'ai affiché le class loader de la servlet et celui de l'exception pour ma petite application de test dont je t'ai parlé. voila les résultats :  
 
 
10:22:17,942 INFO  [STDOUT] classloader de la servletWebappClassLoader
  delegate: false
  repositories:
    /WEB-INF/classes/
----------> Parent Classloader:
java.net.FactoryURLClassLoader@1a40fff
10:22:17,981 INFO  [STDOUT] classloader de l'exception : WebappClassLoader
  delegate: false
  repositories:
    /WEB-INF/classes/
----------> Parent Classloader:
java.net.FactoryURLClassLoader@1a40fff
10:22:17,982 INFO  [STDOUT] ds le catch de AppException
10:22:17,982 ERROR [STDERR] Impossible de cr\uffffer le bean : MyExceptions.AppException: exception lancee depuis sayHello

Reply

Marsh Posté le 23-03-2006 à 10:26:58    

Quand le classloader est le même tout se passe bien !! Y a-t-il un moyen de controler ca??

Reply

Marsh Posté le 25-03-2006 à 10:18:12    

Problème résolu, j'avais inclut la définition de la classe à la fois dans le *.war et dans le *.jar. Il y avait donc définition de InvalidDataException. C'est pourquoi l'exception lancée de l'ejb et le catch de la servlet ne concernait pas la même exception.
 
A+

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed