2017-09-12 5 views
1

J'ai une classe de service transactionnel:Spring: Comment engager la transaction avant d'entrer dans @AfterReturning conseils

@Service 
@Transactional(...) 
public class MyService() { 

    public void myFunc() { 
     // some code 
    } 

} 

également l'aspect suivant:

@Aspect 
public class MyAspect() { 

    @AfterReturning(value = "execution(...") // pointcut matching myFunc()'s signature 
    public void doSomethingAfterMyFunc() { 
     // some code 
    } 

} 

Le problème que je suis face est que lors de la saisie du conseil @AfterReturning, la transaction créée à partir de l'exécution de myFunc() n'est pas encore validée, de sorte que le conseil partage la même transaction. De ce que j'ai lu ce comportement est à prévoir, mais pour mes fins j'ai besoin de l'opposé - est-il un moyen de valider la transaction myFunc() avant d'entrer dans le conseil?

Merci d'avance!

+0

Définissez explicitement 'order' sur' @ EnableTransactionManagement' et '@ EnableAspectJAutoProxy'. Assurez-vous que ce dernier va en premier. –

Répondre

1

Ce qui se passe à cause de la @Transactional Aspect, vous avez donc 2 aspects dans votre code afin que vous devez définir le Order comme expliqué https://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-ataspectj-advice-ordering

Dans votre code, vous pouvez définir l'ordre de votre propre aspect MyAspect comme le suivant:

@Aspect 
@Order(1) 
public class MyAspect() { 
//your code here 
} 

En spécifiant son ordre à 1 et que la règle est que:

Sur e En sortie du point de jointure, le conseil avec la valeur de commande la plus élevée est exécuté en premier.

l'aspect @Transactional sera exécuté le vôtre avant si myFunc va obtenir commited et doSomethingAfterMyFunc sera exécuté.

+0

Ce que vous dites semble logique et je l'ai essayé. Mais ça ne marche toujours pas. –

+0

Eh bien, nous avons eu exactement le même problème dans notre projet et nous l'avons résolu en définissant 'Order' dans notre' Aspect'. Avez-vous également défini l'ordre dans '@EnableTransactionManagement' selon @ M.Deinum suggéré? Si vous le faites, il doit être supérieur à 1. Bien que la valeur par défaut soit déjà largement supérieure à 1. Cela aurait dû marcher dans votre projet. – pleft

+0

Oui, j'ai tout essayé. À la fin de la journée, j'ai fini par utiliser @TransactionalEventListener au lieu d'un conseil AfterReturning pour exécuter le code nécessaire après la fin de myFunc(). –