Bonjour
J'ai deja posté ma question sur un autre poste (http://www.developpez.net/forums/d66...ne-fonctionne/), mais vu qu'il était marqué comme "résolu" (avant d'avoir posté ma question) , j'ai bien peur que personne ne me vienne en aide... donc si la question suivante n'a pas lieu d'être ici , veuillez m'en excuser ...
voici ma classe service
mon test :
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 @Service("faxServiceTarget") @Scope("singleton") @Transactional(readOnly = false, propagation = Propagation.REQUIRED) public class FaxService implements IFaxService { public IFaxModel saveFaxModel(IFaxModel faxModel) { return getFaxDao().saveFaxModel(faxModel); } public IFaxModel monTest(IFaxModel faxModel) throws Exception { faxModel = saveFaxModel(faxModel); if (true) { throw new Exception("montest esception"); } return faxModel; } }
Je ne sais pas si j'ai bien fait mais j'ai la notion de transaction au niveau de ma classe et non au niveau des méthodes (c'est peut être de la que vient mon problème ? d'ailleurs quels sont les avantages et inconvénients d'un tel choix )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 @Test public void saveFaxModel2() { IFaxModel faxModel_1 = (IFaxModel) getXmlBeanFactory().getBean("faxModel_1"); try { faxModel_1 = getFaxService().monTest(faxModel_1); } catch (Exception e) { e.printStackTrace(); } assert faxModel_1 != null && faxModel_1.getId() != null && faxModel_1.getFaxResults() != null; }
Ce que je ne comprend pas c'est pourquoi la sauvegarde de mon object est bien faite en base
Hikage (dans le poste qui est marque comme résolu) nous dit :
Mon problème proviendrait il du faite que mon save et ma génération de l'exception dans mon service sont faite dans deux transactions différentes vu que j'appelle saveFaxModel depuis mon service et non directement depuis mon test ?Pour la gestion des transactions, Spring créer un proxy. Lorsqu'une methode du service est appelée par une autre composant ( dans lequel le service à été injecté ), l'appel passe par le proxy qui va ouvrir la transaction, faire l'appel à ta methode, et au retour gérer la fin de transaction.
Or ici, testTransaction(), qui est ta methode transactionnelle est appelée directement dans le service, et donc tu ne passe pas dans le proxy.
Résultat, la transaction n'est pas gérée par Spring.
Si c'est le cas comment faire pour que les opérations faites durant un enchaînement de méthodes du même service soient atomique, c'est à dire que si une des méthodes lève une exception, les méthode précédemment exécutées soient "RollBacké"
J'ai trouvé une réponse sur un autre poste (http://www.developpez.net/forums/d51...e-fonctionner/) que j'ai implementé en changeant ma classe service comme ceci :
La sauvegarde de mon objet ne se fait pas en base....
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 @Service("faxServiceTarget") @Scope("singleton") @Transactional(readOnly = false, propagation = Propagation.REQUIRED , rollbackFor = Exception.class) public class FaxService implements IFaxService { [...] }
Quand même , au cas où..., si quelqu'un peut me confirmer que c'est la bonne manière de faire ...
D'avance merci, et désolé de reprendre des postes marqués comme résolus (mais qui me laisse quand même dans le doute :p)
Partager