Problème de hiérarchie de classe Utilisation de @Transactional
-
14-11-2019 - |
Question
Configuration du projet: printemps 3.0.5 / jpa 2 / hibernate / @transactional
Nous travaillons avec plusieurs sources de données différentes (et donc différents gestionnaires de transactions), mais avons des classes de base de service communes, car une grande partie de la fonctionnalité est réutilisée.
Nous avons donc pensé que nous résoudrions cela en utilisant Annotations personnalisées. Nous définissons toutes les méthodes dans une classe de base abstraite et créons une classe d'implémentation vide par gestionnaire de transaction.
Maintenant, le problème est:
Dans AbstractFallbackTransactionAttributeSource
, c'est la recherche qui est faite:
TransactionAttribute txAtt = findTransactionAttribute(specificMethod);
// ...
// Second try is the transaction attribute on the target class.
txAtt = findTransactionAttribute(specificMethod.getDeclaringClass());
La méthode est d'abord vérifiée, puis la classe qui déclare la méthode (et ses ancêtres). Mais dans notre contexte, l'annotation personnalisée réside dans une sous-classe qui ne peut être trouvée en montant.
Alors, comment pouvons-nous résoudre ce problème?
J'ai aussi posé cette question dans le forum de la communauté du printemps]
La solution 2
Pour le moment, nous avons résolu ce problème en fournissant
- Notre propre sous-classe de
AnnotationTransactionAttributeSource
qui fait d'abord une recherche sur la classe cible, puis délégue à la super classe - UN
BeanFactoryPostProcessor
qui remplace notre implémentation par l'originalAnnotationTransactionAttributeSource
Définition de bean qui est créée en interne par<tx:annotation-driven>
.
Autres conseils
Superbe capture. Je ne connais pas une bonne solution mais en tant que solution de contournement, vous pouvez remplacer les méthodes en question dans la mise en œuvre comme ça:
@Override
void method(...)
// Just to work around a bug in AbstractFallbackTransactionAttributeSource
super.method(...);
}
qui fera le @Transactional
Visible mais c'est moche: - /