@ManagedBean et @Transactional - Bug au printemps? Solutions de contournement?
-
28-10-2019 - |
Question
J'ai eu le bean de support JSF suivant dans mon webapp
@ManagedBean
class MyBackingBean implements Serializable {
private MyHibernateRepository repository;
...
@Transactional
public void save() {
....
repository.save(myObject);
}
}
Quand il arrive au repository.save
Appel de méthode - j'obtiens l'erreur suivante
no transaction is in progress
J'ai deux questions
- Est-ce à cause d'un bug comme ça?
- Je crois qu'il y a deux solutions de contournement - y en a-t-il d'autres?
2.1 Première solution de contournement - Utilisation
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
repository.save(myObject);
}
});
2,2 seconde de solution de contournement
Créez une classe d'assistance et annotez à la place.
2.3 (Une troisième solution de contournement possible consisterait à annoter @Transactional sur une méthode d'une classe intérieure, c'est assez similaire à 2.2).
La solution
Lorsque vous utilisez des annotations de printemps (je sais que @Transactional
est une norme Sun - mais vous avez besoin d'une implémentation) - Spring utilise AOP pour annoter à la classe pour ajouter le code de gestion des transactions. Cela ne fonctionne que pour les haricots de printemps. Si votre classe est un bean de support pour JSF - le framework Mojarra n'inservera pas son propre code de gestion des transactions à cette annotation.
Réponse courte - @Transactional
Fonctionne pour les haricots chargés par le ressort. Sinon, vous devez trouver un cadre qui le prend en charge ou supposer qu'il ne fonctionnera pas.