Forum Programmation.java servlet ne catch pas une exception lancée par un EJB

Posté par  .
Étiquettes : aucune
0
21
mar.
2006
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 bientôt
  • # Type d'exception

    Posté par  (site web personnel) . Évalué à 1.

    Je vais peut-être dire une bêtise, mais il me semblait que seules les RemoteException étaient remontées au client dans le cas d'un client exécuté de manière distante. La javadoc de cette classe semble même parler d'encapsulation des exceptions levées dans le Bean au sein d'une RemoteException :

    As of release 1.4, this exception has been retrofitted to conform to the general purpose exception-chaining mechanism. The "wrapped remote exception" that may be provided at construction time and accessed via the public detail field is now known as the cause, and may be accessed via the Throwable.getCause() method, as well as the aforementioned "legacy field."
    • [^] # Re: Type d'exception

      Posté par  . Évalué à 1.

      He bien oui mais apparemment c'est uniquement le cas pour les exceptions systèmes. Pour les exception de l'application ce n'est pas le cas. Je tiens ces infos de ce site :

      http://coding.mu/archives/2003/09/03/ejb-exception-handling/

      "Because the EJB container does not know how to process an application-specific exception, it does not intercept any. Also, application exceptions are not logged by the container. Developers need not wrap such an exception in an EJBException. In fact, to prevent the container from hi-jacking the exception, developers SHOULD NOT write code to swallow the exception."
      • [^] # Re: Type d'exception

        Posté par  (site web personnel) . Évalué à 1.

        Ce que dit le texte dont tu parles concerne les EJBException. Cela se comprend, parceque cette exception intervient lorsque le cycle de vie de l'EJB est mis en péril.

        La RemoteException en revanche ne sert pas à la même chose : elle n'est d'ailleurs pas "hi-jackée" par le container. De ce que j'ai compris, avant la version 1.4, elle servait uniquement aux exceptions liées à la communication entre l'interface remote et l'EJB, mais depuis la 1.4, elle sert aussi à encapsuler les autres exceptions pour fournir un moyen de les remonter.
        • [^] # Re: Type d'exception

          Posté par  . Évalué à 1.

          Au lieu du catch(InvalidDataException ex) que j'avais écrit j'ai mis un catch(Exception ex).
          Lorsque je fais ca il rentre bien dans le catch de Exception, et dans celui-ci j'affiche le type de l'exception lancée.
          Le résultat est le type de mon exception InvalidDataException.

          Cela prouve bien que mon InvalidDataException n'est pas encapsulée n'est ce pas?
          • [^] # Re: Type d'exception

            Posté par  (site web personnel) . Évalué à 2.

            Le résultat est le type de mon exception InvalidDataException.

            De quelle manière obtiens-tu ce résultat : getMessage, toString, ou bien getClass().getName() ? Parceque si la classe de l'exception était bel-et-bien InvalidDataException, cela serait catché...
            • [^] # Re: Type d'exception

              Posté par  . Évalué à 1.

              oui c'est bien la le problème

              voila texto le catch :

              catch(Exception exc)
              {
              System.out.println("type de l'exception lancée : "+exc.getClass());
              }
  • # re: servlet ne catch pas une exception lancée par un EJB

    Posté par  . Évalué à 1.

    Salut,

    Effectivement, il doit certainement falloir que ta classe d'exception
    implémente aussi "serializable", d'ou la classe RemoteException.
    Il faut certainement que tu cherches dans ce sens.
    D'autre part, pour une question de lisibilité, il faudrait peut etre mieux
    renommer ta classe en InvalidDataException.

    a+
    Xavier
  • # pas remote

    Posté par  . Évalué à 1.

    Mais ce que j'ai oublié de dire c est que ma servlet et mon EJB tourne sur la même machine. Je n'utilise que les interfaces locales de mon EJB.
    Donc je suppose que je ne pourrais pas avoir de RemoteException, je me trompe?
    • [^] # Re: pas remote

      Posté par  (site web personnel) . Évalué à 1.

      C'est marrant, j'avais cru lire :
      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.

      ;o)
      • [^] # Re: pas remote

        Posté par  . Évalué à 1.

        oui c est bien juste mais la servlet et l'EJB se trouve sur la même machine. Donc pas de remoteException entre les deux. la servlet et l'ejb se trouve dans le même *.ear sur un serveur jboss auquel j'accède à distance avec mon navigateur
  • # le problème est lié au classloader

    Posté par  . Évalué à 1.

    J'ai remarqué que la servlet ne catchait pas l'exception lorsque le classLoader de l'exception et de la servlet sont différents. Lorsqu'ils sont les mêmes, il n'y a pas de problème. Est ce que quelqu'un peut me donner des informations sur cela?


    Merci!

    A bientôt
  • # le problème est lié au classloader

    Posté par  . Évalué à 1.

    J'ai remarqué que la servlet ne catchait pas l'exception lorsque le classLoader de l'exception et de la servlet sont différents. Lorsqu'ils sont les mêmes, il n'y a pas de problème. Est ce que quelqu'un peut me donner des informations sur cela?


    Merci!

    A bientôt
  • # RESOLU

    Posté par  . Évalué à 3.

    le problème est résolu! J'avais inclut la classe InvalidDataException dans mon archive war et dans le jar. Il y avait donc deux définitions de la classe. C'est pourquoi à l'éxécution l'exception lancée n'était pas la même que celle que je voulais catcher.


    Merci pour votre aide.

    A bientot
    • [^] # Re: RESOLU

      Posté par  (site web personnel) . Évalué à 2.

      Et merci d'avoir posté la solution à ton problème, c'est assez rare pour être souligné :o)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.