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

JPA Java Discussion :

comment attraper cette exception ?


Sujet :

JPA Java

  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut comment attraper cette exception ?
    Salut a tous,
    en effectuant quelque tests sur une entity j'ai remarqué un truc louche.
    Lorsque le bean façade tente d'inserer un tuple avec une clé primaire existante une exception est lancé ce qui est tout a fait normal, le problème c'est que je n'arrive pas a attraper les exceptions généré !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public void create(Langue langue) {
            System.err.println("---------------------------");
            try {
                em.persist(langue);
            }
            catch(Exception e)
            {
                System.out.println("exception attrapé");
            }
    "exception attrapé" n'est jamais affiché
    Que faire ?
    Merci d'avance.

  2. #2
    Membre Expert

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Par défaut
    Avec Throwable ca fait pareil ?

    Quel est le type de l'exception jetée ?

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut
    c'est pareil avec throwable .
    Voila la trace complète
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    SQL Error: 0, SQLState: null
    L'élément du batch 0 insert into langue (langue) values (langue 1) a été annulé. Appeler getNextException pour en connaître la cause.
    SQL Error: 0, SQLState: 23505
    ERROR: duplicate key value violates unique constraint "pk_langue"
    Could not synchronize database state with session
    org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
            at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
            at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
            at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
            at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
            at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
            at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
            at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
            at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
            at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
            at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:523)
            at com.sun.enterprise.distributedtx.J2EETransaction.commit(J2EETransaction.java:419)
            at com.sun.enterprise.distributedtx.J2EETransactionManagerOpt.commit(J2EETransactionManagerOpt.java:371)
            at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:3792)
            at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3571)
            at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)
            at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
            at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
            at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
            at $Proxy73.addPays(Unknown Source)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
            at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
            at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
            at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
            at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
            at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
            at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
            at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
            at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
            at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
            at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
    Caused by: java.sql.BatchUpdateException: L'élément du batch 0 insert into langue (langue) values (langue 1) a été annulé. Appeler getNextException pour en connaître la cause.
            at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2537)
            at org.postgresql.core.v3.QueryExecutorImpl$1.handleError(QueryExecutorImpl.java:403)
            at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1328)
            at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:351)
            at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2674)
            at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
            at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
            ... 31 more
    EJB5018 : Une exception a été renvoyée lors d'un appel ejb sur [DaoPaysBean].
    javax.ejb.EJBException: Transaction aborted; nested exception is: javax.transaction.RollbackException: La transaction a été marquée comme devant être annulée.
    javax.transaction.RollbackException: La transaction a été marquée comme devant être annulée.
            at com.sun.enterprise.distributedtx.J2EETransaction.commit(J2EETransaction.java:440)
            at com.sun.enterprise.distributedtx.J2EETransactionManagerOpt.commit(J2EETransactionManagerOpt.java:371)
            at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:3792)
            at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3571)
            at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)
            at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
            at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
            at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
            at $Proxy73.addPays(Unknown Source)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
            at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
            at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
            at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
            at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
            at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
            at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
            at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
            at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
            at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
            at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
    javax.ejb.EJBException: Transaction aborted; nested exception is: javax.transaction.RollbackException: La transaction a été marquée comme devant être annulée.
            at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:3798)
            at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3571)
            at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)
            at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
            at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
            at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
            at $Proxy73.addPays(Unknown Source)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
            at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
            at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
            at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
            at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
            at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
            at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
            at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
            at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
            at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
            at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par isoman Voir le message
    Salut a tous,
    en effectuant quelque tests sur une entity j'ai remarqué un truc louche.
    Lorsque le bean façade tente d'inserer un tuple avec une clé primaire existante une exception est lancé ce qui est tout a fait normal, le problème c'est que je n'arrive pas a attraper les exceptions généré !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public void create(Langue langue) {
            System.err.println("---------------------------");
            try {
                em.persist(langue);
            }
            catch(Exception e)
            {
                System.out.println("exception attrapé");
            }
    "exception attrapé" n'est jamais affiché
    Que faire ?
    Merci d'avance.
    l'exception est levée lors du COMMIT pas lors du persist…

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut
    et je fais comment pour l'attraper ?

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    try / catch autour du commit

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par isoman Voir le message
    et je fais comment pour l'attraper ?
    comment gérez-vous les transactions ?

  8. #8
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut
    tchize_> justement il n'a aucun commit .
    Pour enregistrer un objet Langue j'appele la fonction create() .
    JeitEmgie>euh j'ai pas compris la question , c'est le premier exemple avec les entity

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par isoman Voir le message
    tchize_> justement il n'a aucun commit .
    Pour enregistrer un objet Langue j'appele la fonction create() .
    JeitEmgie>euh j'ai pas compris la question , c'est le premier exemple avec les entity

    @Transactional ?
    AOP ?
    config de applicationContext.xml ?



    NB
    si vous vous attaquez à JPA sans comprendre comment fonctionnent les transactions, vous n'avez pas fini de poster des questions dans les forums…
    un petit tour de lecture de doc ne ferait pas de tort…

  10. #10
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut
    c'est le serveur d'application qui gère les transaction a travers JTA (si je me trompe pas )

  11. #11
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par isoman Voir le message
    c'est le serveur d'application qui gère les transaction a travers JTA (si je me trompe pas )
    c'est vous qui en décidez dans les paramètres de votre configuration…

  12. #12
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Par défaut
    oui je sais , c'est bien JTA .

  13. #13
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par isoman Voir le message
    oui je sais , c'est bien JTA .
    de toute façon cela ne change rien à votre problème :

    une fonction "create" qui peut accepter des objets déjà existants dans le repository est mal nommée…

    si réellement cela doit être sa fonctionnalité, outre la renommer pour la compréhension du code, il faut aussi appeler merge() et non persist() et en conséquence il faut que cette fonction renvoie le résultat du merge()…

    ce qui fera disparaître l'exception…



    maintenant en cas d'absolue nécessité d'intercepter l'exception, le stack trace de votre cas montre que c'est addPays() qui est la fonction du niveau "service" qui est gérée transactionnellement…

    c'est donc elle qui doit être la cible de l'interception,
    soit en la découplant en addPays() (NON transactionnelle) avec try/catch autour d'un addPaysTrans() qui lui serait transactionnel…

    soit en utilisant AOP pour y associer un "after throws advice" …

  14. #14
    Membre actif
    Inscrit en
    Août 2004
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 41
    Par défaut
    Bonjour,

    Je me permet de revenir sur ce message car j'ai également le même problème de try/catch avec des transactions JTA

    J'ai un ear qui contient 3 couches de services:
    FacadeService qui sont des EJB3 Stateless
    AppService qui sont des bean spring
    DomainService qui font les accès à l'entityManager

    Le tout configuré avec Spring AOP pour la transaction

    L'application tourne correctement, mais j'ai une application WebService qui vient requeter mon EAR. Cette application cherche a insérer des données qui provoquent des "java.sql.BatchUpdateException: ORA-02291: violation de contrainte d'intégrité"
    Or l'exception que reçoit le webservice est une "javax.ejb.EJBTransactionRolledbackException: Transaction rolled back" peu explicite.

    J'aimerai donc catcher ce BatchUpdateException soit dans le FacadeService, soit dans l'AppService pour envoyer ma propre MyServiceException("Impoosible d'enregistrer Table A si Table B n'existe pas") afin que le WebService puisse corriger ses données d'entrée.

    J'ai essayé de regarder comme préconisé par JeitEmgie "after throw advice" mais ça m'a l'air un peu complexe, et je voudrais savoir s'il n'y a pas plus simple...

    Merci d'avance pour votre éclairage

  15. #15
    Membre averti
    Inscrit en
    Août 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 49
    Par défaut
    A vérifier mais il me semble que l'erreur dont vous parlez n'est pas une exception utilisateur au sens JAVA du terme mais une RuntimeException ou EJBException dans les EJB 3. Donc ton catch tu ne peux pas l'attraper ainsi. Ajoute RuntimeException qui sont des erreurs d'exécution d'un niveau différent des Exception classique

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/05/2011, 15h51
  2. comment résoudre cette exception?merci
    Par achraf11 dans le forum Hibernate
    Réponses: 0
    Dernier message: 24/03/2010, 14h26
  3. Réponses: 13
    Dernier message: 10/04/2008, 19h13
  4. Réponses: 1
    Dernier message: 22/08/2006, 15h26
  5. Comment attraper une exception ?
    Par ionix dans le forum Langage
    Réponses: 20
    Dernier message: 05/07/2006, 12h40

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