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]

Était-ce utile?

La solution 2

Pour le moment, nous avons résolu ce problème en fournissant

  1. Notre propre sous-classe deAnnotationTransactionAttributeSourcequi fait d'abord une recherche sur la classe cible, puis délégue à la super classe
  2. UN BeanFactoryPostProcessor qui remplace notre implémentation par l'original AnnotationTransactionAttributeSource 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: - /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top