IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Flex Discussion :

Utiliser ses propres Exceptions avec Blazeds-Spring-Hibernate


Sujet :

Flex

  1. #1
    Membre averti
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Par défaut Utiliser ses propres Exceptions avec Blazeds-Spring-Hibernate
    Bonjour

    j'ai une application utilisant Blazeds, Spring et Hibernate côté serveur
    je voudrais catcher les exceptions de Hibernate et envoyer mes propres exceptions et les récupérer côté client pour pouvoir gérer les exceptions mais le problème c'est que Spring catche mes exceptions et envoie les siens du coup je ne peux plus récupérer mes exceptions.

    Par exemple quand un utilisateur s'inscrit à l'application, à la création du nouveau compte utilisateur Hibernate va envoyer une NonUniqueObjectException que je récupère et j'envoie mon exception

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        @Transactional
        public void createUser(UtilisateurVO user, int droit) throws Exception      {
            try {
                utilisateurDAO.createUser(user);
                moduleDAO.setPrivileges(user, droit);
            }
            catch(NonUniqueObjectException e)
            { 
                    e.printStackTrace();
                    throw new RuntimeException("login non unique");
            }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            private function createUserFault(e:FaultEvent):void
            {
                button.enabled = true;
                ro.getOperation("createUser").removeEventListener(ResultEvent.RESULT, createUserResult);
                ro.getOperation("createUser").removeEventListener(FaultEvent.FAULT, createUserFault);
                  var errorMessage:ErrorMessage = e.message as ErrorMessage;
     
    switch(errorMessage.rootCause.message)
    {
            case 'login non unique': Alert.show("le login que vous avez choisis est reservé, veuillez choisir un autre login"); break;
    }
    trace(errorMessage.rootCause.message);    
    trace(errorMessage.rootCause.rootCause.message);
    le message que je voie à la console n'est pas le message de mon exception mais c'est celui de l'exception de Spring

    JPA transaction unexpectedly rolled back (maybe marked rollback-only after a failed operation); nested exception is javax.persistence.RollbackException: Error while commiting the transaction
    Error while commiting the transaction
    pour l'intégration de Spring et Blazeds j'utilise la technique su SpringFactory décrite dans ce tutorial : http://fponchel.developpez.com/tutor...lazeds-spring/

    Voilà je crois que le problème est clair, quelqu'un aurait une solution ?

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 895
    Par défaut
    Bonjour,

    Qu'as tu dans ta stacktrace côté serveur ?

    Autre remarque en regardant ton code :
    - Tu devrais retourner une Exception et non une RuntimeException (sinon le throws Exception dans la signature de ta méthode ne sert à rien) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    throw new  RuntimeException("login non unique");
             }
    - Tu devrais ajouter ceci dans l'annotation de ta méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Transactional(rollbackFor=Exception.class)
    Cela te permettra de faire un rollback lorsqu'une exception est levée.

  3. #3
    Membre averti
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Par défaut
    - Tu devrais retourner une Exception et non une RuntimeException (sinon le throws Exception dans la signature de ta méthode ne sert à rien) :
    j'ai essayé avec Exception et RuntimeException


    Spring catche toutes les exceptions et fait RollBack sans que je lui demande
    quand il ya une exception elle est envoyée au client danc il ya pas de printStackTracer dans la console

    sinon je pense pas que j'ai une erreur dans le code, mais je pense q'il ya quelque chose qu'il faut changer dans Blazeds ou Spring pour que blazeds envoie mon exception au client et pas celle de Spring

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 895
    Par défaut
    Mais tu devrais avoir une stacktrace plus compléte côté serveur étant donné que tu fais un e.printStackTrace(); dans ton code.

  5. #5
    Membre averti
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Par défaut
    voila

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    [BlazeDS]14:32:53.109 [DEBUG] [Endpoint.AMF] Serializing AMF/HTTP response
    Version: 3
      (Message #0 targetURI=/2/onStatus, responseURI=)
        (Typed Object #0 'flex.messaging.messages.ErrorMessage')
          headers = (Object #1)
            DSMPIO = (Typed Object #2 'flex.messaging.messages.MessagePerformanceInfo')
              serverPreAdapterTime = 0.0
              serverPreAdapterExternalTime = 0.0
              infoType = null
              sendTime = 1.270816372921E12
              recordMessageTimes = false
              serverPrePushTime = 0.0
              pushedFlag = false
              serverPostAdapterExternalTime = 0.0
              receiveTime = 0.0
              messageSize = 0.0
              overheadTime = 0.0
              recordMessageSizes = false
              serverPostAdapterTime = 0.0
          rootCause = (Typed Object #3 'org.springframework.transaction.UnexpectedRollbackException')
            rootCause = (Typed Object #4 'javax.persistence.RollbackException')
              message = "Error while commiting the transaction"
              localizedMessage = "Error while commiting the transaction"
              cause = (Typed Object #5 'org.hibernate.NonUniqueObjectException')
                message = "a different object with the same identifier value was already associated with the session: [vo.UtilisateurModuleVO#admin1]"
                localizedMessage = "a different object with the same identifier value was already associated with the session: [vo.UtilisateurModuleVO#admin1]"
                cause = null
                throwableCount = 1
                throwables = (Array #6)
                  [0] = (Ref #5)
                identifier = (Typed Object #7 'vo.IdUtilisateurModuleVO')
                  idModule = 1
                  login = "admin"
                messages = (Array #8)
                  [0] = "a different object with the same identifier value was already associated with the session"
                entityName = "vo.UtilisateurModuleVO"
            message = "JPA transaction unexpectedly rolled back (maybe marked rollback-only after a failed operation); nested exception is javax.persistence.RollbackException: Error while commiting the transaction"
            localizedMessage = "JPA transaction unexpectedly rolled back (maybe marked rollback-only after a failed operation); nested exception is javax.persistence.RollbackException: Error while commiting the transaction"
            cause = (Ref #4)
            mostSpecificCause = (Ref #4)
          body = null
          correlationId = "ED2EBFBF-257A-369B-511A-E28EF668D85B"
          faultDetail = null
          faultString = "org.springframework.transaction.UnexpectedRollbackException : JPA transaction unexpectedly rolled back (maybe marked rollback-only after a failed operation); nested exception is javax.persistence.RollbackException: Error while commiting the transaction"
          clientId = "601F0B73-1E08-155C-7E3E-120233E25484"
          timeToLive = 0.0
          destination = "utilisateurDest"
          timestamp = 1.270816372921E12
          extendedData = null
          faultCode = "Server.Processing"
          messageId = "601F0D3B-A90F-E341-5190-290200417E3C"
    il n'ya meme pas de printstacktracer
    et coté client c'est org.springframework.transaction.UnexpectedRollbackExceptio qui est recuperée


    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
    	@Transactional
    	public void createUser(UtilisateurVO user, int droit) throws Exception {
    		try {
    			utilisateurDAO.createUser(user);
    			moduleDAO.setPrivileges(user, droit);
    		}
    		catch(NonUniqueObjectException e)
    		{ 
    				e.printStackTrace();
    				throw new Exception("login non unique");
    		}
    		catch(Exception e2) {
    			e2.printStackTrace();
    			throw new Exception("login non unique");
    		}
    	}

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 895
    Par défaut
    Je sais que j'insiste mais cela nous permettras de t'aider plus facilement et plus rapidement.
    Côté serveur tu as bien un serveur d'application comme tomcat et compagnie. Dans les logs de celui ci tu devrais trouver ta fameuse stacktrace que je te demande depuis tout à l'heure. Car lorsque tu fais un printStackTrace, celle-ci est affiché dans ta sortie standard qui est dans ton cas les logs de ton serveur d'application.

    As tu compris de quoi je voulais parler ?

  7. #7
    Membre averti
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Par défaut
    En fait il n'y a pas de printStackTracer dans la console.

    Je comprend maintenant pourquoi je n'arrive pas à récupérer mon exception dans Flex, c'est parce que je n'ai attrapé aucune exception dans mon try/catch et parce que Spring fait un commit à la transaction après l'execution de createUser() et donc après le try catch et c'est lui qui attrape la RollBackException et envoie son UnexpectedRollbackException après.

    Pour résoudre ça il me faut une méthode qui appelle la méthode transactionnelle createUser() en faisant un try/catch et comme ça je peux attraper l'exception qu'envoie spring.


    J'ai essayé de changer mon service comme ça

    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
    public class UtilisateurService implements IUtilisateurService{
    ...
    ...
              @Transactional(propagation=Propagation.REQUIRED)
        public void createUser(UtilisateurVO user, int droit) {
                utilisateurDAO.createUser(user);
                moduleDAO.setPrivileges(user, droit);
        }
     
        public void createUserExp(UtilisateurVO user, int droit) throws Exception {
            try {
                createUser(user, droit);
            }
            catch(Exception e) {
                e.printStackTrace();
                throw new Exception("login non unique");
            }
        }
     
    ...
    }
    et en faisant appel à createUserExp au lieu de createUser dans Flex.

    Mais ça ne marche pas j'ai une sessionException ... j'ai cherché et j'ai trouvé ici www.developpez.net/forums/d669027/java/general-java/spring/spring-transaction-transactional-rollback-ne-fonctionne/
    qu'on ne peut pas appeler une méthode transactionnelle dans un service depuis une autre méthode de ce même service

    alors j'ai enlevé @Transactional de createUser et je l'ai mis dans les DAO comme ça



    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
     
        public void createUser(UtilisateurVO user, int droit) {
                utilisateurDAO.createUser(user);
                moduleDAO.setPrivileges(user, droit);
        }
     
        public void createUserExp(UtilisateurVO user, int droit) throws Exception {
            try {
                createUser(user, droit);
            }
            catch(Exception e) {
                e.printStackTrace();
                throw new Exception("login non unique");
            }
        }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     @Transactional(propagation=Propagation.REQUIRED)
        public void createUser(UtilisateurVO user) 
        {
                setCreatedAt(user);
                setUpdatedAt(user);
                em.persist(user);
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     @Transactional(propagation=Propagation.REQUIRED)
        public void setPrivileges(UtilisateurVO user, int droit) {
            List<ModuleVO> list = getAllModules();
            for(int i=0; i<list.size(); i++){
                UtilisateurModuleVO um = new UtilisateurModuleVO();
                um.setDroit(droit);
                ((ModuleVO) list.get(i)).addPrivilegeUtilisateur(um);
                user.addPrivilegeModule(um);
            }
        }
    là ça marche, si je vais faire comme ça veut dire que je vais enlever toutes les @Transactional de mes services et mettre des @Transactional dans mes DAO, je sais pas si ça pose pas de problèmes de travailler comme ça.
    En plus je ne peux pas catcher les exceptions de Hibernate dans createUserExp
    Quand je fais par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        public void createUserExp(UtilisateurVO user, int droit) throws Exception {
            try {
                createUser(user, droit);
            }
            catch(ConstraintViolationException e) {
                e.printStackTrace();
                throw new Exception("login non unique");
            }
        }
    ça ne marche pas

  8. #8
    Membre averti
    Inscrit en
    Février 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 20
    Par défaut
    J'arrive à récupérer la UnexpectedRollbackException et donc connaître la cause du Fault et savoir quel message afficher à l'utilisateur en faisant des appels à getCause() et en déclarant les méthodes de mon services comme non Transactionnelles et celles de mes DAO comme @Transactional(propagation=Propagation.REQUIRED) comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void createUserExp(UtilisateurVO user, int droit) throws Exception {
            try {
                createUser(user, droit);
     
            }
            catch(UnexpectedRollbackException e) {
                if(e.getCause().getCause().getClass() == org.hibernate.exception.ConstraintViolationException.class) {
                    throw new ServiceException("Le login que vous avez choisis est reservé, veillez choisir un autre login", 1);
                }
                else {
                    throw e;
                }
            } 
        }
    le problème est résolu mais je ne sais pas si c'est très propre de gérer les exceptions comme ça avec des appels à getCause() et de travailler avec des services non transactionnels et des DAO @Transactional(propagation=Propagation.REQUIRED)

    si quelqu'un a une meilleure façon de faire ça je suis preneur

Discussions similaires

  1. Utiliser ses propres classes avec Zend Framework
    Par Adinsx dans le forum Zend Framework
    Réponses: 3
    Dernier message: 28/02/2008, 20h01
  2. Creer ses propres exceptions ?
    Par Seth77 dans le forum C#
    Réponses: 4
    Dernier message: 05/05/2007, 17h36
  3. Lancer ses propres exceptions
    Par mister3957 dans le forum C++
    Réponses: 13
    Dernier message: 03/03/2007, 12h55
  4. [JNI] creer ses propres exceptions
    Par Batou dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 23/08/2006, 04h01
  5. Créer ses propres exceptions
    Par Neilos dans le forum C++Builder
    Réponses: 10
    Dernier message: 13/06/2006, 18h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo