Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2782 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1329641
Nibuzer
Posté le 21-03-2006 à 16:54:39  profilanswer
 

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

mood
Publicité
Posté le 21-03-2006 à 16:54:39  profilanswer
 

n°1329785
Smanux
Posté le 21-03-2006 à 21:08:45  profilanswer
 

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


---------------
Commons Configuration - http://jakarta.apache.org/commons/configuration
n°1329792
benou
Posté le 21-03-2006 à 21:24:54  profilanswer
 

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


---------------
ma vie, mon oeuvre - HomePlayer
n°1329951
Nibuzer
Posté le 22-03-2006 à 09:03:54  profilanswer
 

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

n°1329953
benou
Posté le 22-03-2006 à 09:07:33  profilanswer
 

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
n°1329957
Nibuzer
Posté le 22-03-2006 à 09:17:24  profilanswer
 

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(..)

n°1330134
Smanux
Posté le 22-03-2006 à 12:56:57  profilanswer
 

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
n°1330164
the real m​oins moins
Posté le 22-03-2006 à 13:33:38  profilanswer
 

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 ?
n°1330166
the real m​oins moins
Posté le 22-03-2006 à 13:34:34  profilanswer
 

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 ?
n°1330179
Nibuzer
Posté le 22-03-2006 à 13:45:15  profilanswer
 

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

mood
Publicité
Posté le 22-03-2006 à 13:45:15  profilanswer
 

n°1330181
Nibuzer
Posté le 22-03-2006 à 13:50:06  profilanswer
 

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!!

n°1330183
the real m​oins moins
Posté le 22-03-2006 à 13:52:43  profilanswer
 

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 ?
n°1330187
Smanux
Posté le 22-03-2006 à 13:57:13  profilanswer
 

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
n°1330200
Nibuzer
Posté le 22-03-2006 à 14:08:47  profilanswer
 

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?

n°1330217
Nibuzer
Posté le 22-03-2006 à 14:25:57  profilanswer
 

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??

n°1330310
nano206
Posté le 22-03-2006 à 16:14:45  profilanswer
 

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

n°1330340
Smanux
Posté le 22-03-2006 à 16:37:53  profilanswer
 

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
n°1330763
Nibuzer
Posté le 23-03-2006 à 09:21:27  profilanswer
 

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!!

n°1330815
Nibuzer
Posté le 23-03-2006 à 10:23:19  profilanswer
 

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

n°1330819
Nibuzer
Posté le 23-03-2006 à 10:26:58  profilanswer
 

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

n°1332062
Nibuzer
Posté le 25-03-2006 à 10:18:12  profilanswer
 

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+

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
Problème d'appel à une servlet avec HREF et chemin relatifJSP/Servlet Initialisation d'un formulaire
[Java J2EE Servlet] récupérer des fichiers inclus dans un warjsp/servlet/web.xml
jndi exceptionProjet de jeu Servlet/Jsp besoin d'un peu d'aide :/
[Borland C++} gestion des exception en graphique - GrrrJSP et Servlet
problème requête client vers servletApplication JAVA retourne une FATAL EXCEPTION
Plus de sujets relatifs à : ma servlet ne catch pas une exception lancée par mon EJB


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR