J'ai relu votre question plusieurs fois et je ne suis pas sûr de comprendre complètement votre question. Je suppose que votre exécution someCode et si cela échoue, vous souhaitez exécuter myCustomRollback qui a quelques informations sur someCode. Donc, je vais essayer de fournir une réponse générique.
Si vous voulez que le ressort annule du code. Il annulera seulement ce qui est rollBackAble, comme les transactions jdbc. Supposons que vous avez une méthode qui effectue 2 appels.
@Transactional
public void doStuff(SomeEntity entity, File file) {
persist(entity);
customFileService.createOnFileSystem(file);
throw new RunTimeException();
}
Ainsi, le code ci-dessus sera toujours annulé. Cela annulera la persistance de votre entité, mais pas la création de votre fichier, car elle n'est pas gérée par les transactions Spring, sauf si vous fournissez une implémentation personnalisée.
Deuxièmement, Spring fournit 2 façons de travailler avec les transactions:
- Spring AOP: un proxy est créé lors de l'exécution qui décorera votre code avec des trucs transactionnel. Si votre classe s'appelle MyClass, alors Spring créera un nom de classe MyClassProxy, qui encapsulera votre code dans le code transactionnel. AspectJ: au moment de la compilation, votre fichier .class sera ajusté et le code transactionnel sera intégré à votre méthode.
L'approche aspectJ semble plus difficile à configurer, mais n'est pas tellement et est beaucoup plus facile à utiliser. Puisque tout ce qui est annoté avec @Transactional sera incorporé (tissé) avec du code. Pour Spring AOP ce n'est pas le cas. Les appels de méthode internes transactionnels par exemple au printemps seront ignorés! Donc, aspectJ fournit une approche plus intuitive.
Retour à ce que je pense que votre question est (le code est dans 1 classe):
public void doSomeCode() {
Object restCall = initialize();
try {
execute(restCall);
} catch (CustomException e) {
myCustomRollback(restCall; e);
}
}
@Transactional(rollbackFor = CustomException.class)
private void execute(Object restCall) throws CustomException {
// jdbc calls..
restCall = callRest(restCall);
throw new CustomException();
}
void myCustomRollback(Object restCall, CustomException e) {
...
}
Le code ci-dessus ne fonctionne qu'avec AspectJ! Depuis que vous faites des appels à la méthode interne, ce qui semble également privé! AOP à l'exécution ne peut pas gérer cela. Donc, ce qui se passe est que tout ce qui est rollbackAble en exécution sera annulé. Et dans doStuff vous avez des informations sur les objets qui ont été utilisés dans l'exécution, vous pouvez maintenant utiliser myCustomRollback pour restaurer vos objets REST manuellement.
Je ne sais pas si j'ai répondu à cette question correctement, mais j'espère que cela aidera quelqu'un avec un problème similaire.
solution