2010-01-12 12 views
0

Il est possible d'utiliser le support @Transactional de Spring Framework en dehors d'un conteneur Spring. Dans la documentation de référence se trouve le chapitre sur AspectJ. J'essaie de l'utiliser dans mon application de guichet, mais sans résultat positif.Wicket avec transaction déclarative Spring

application context.xml:

<tx:annotation-driven transaction-manager="transactionManager" mode="aspectj" /> 
<context:annotation-config /> 
<context:component-scan base-package="com.wicket.app"/> 
<context:spring-configured /> 

<bean id="annotationTransactionAspect" factory-method="aspectOf" 
     class="org.springframework.transaction.aspectj.AnnotationTransactionAspect"> 
    <property name="transactionManager" ref="transactionManager"></property> 
</bean> 

Dans ma classe de formulaire annoté par @Configurable, j'ai:

@Transactional 
public void process(IFormSubmittingComponent submittingComponent) { 
    super.process(submittingComponent); 
    getDao().getEntityManager().flush(); 
} 

Trace de la pile:

org.apache.openjpa.persistence.TransactionRequiredException: Can only perform operation while a transaction is active. 

Répondre

4

Vous pourrait être en mesure d'obtenir ce travail en utilisant AspectJ load-time-weaving, mais c'est une solution très complexe pour un problème simple.

Si vous avez besoin de transactions déclaratives, je vous suggère de déplacer la logique transactionnelle du composant guichet vers un bean Spring et d'appeler le bean Spring depuis l'objet guichet. Le bean Spring aurait les annotations transactionnelles, et serait correctement mandaté par le conteneur Spring.

+0

Oui, ma faute. Cette solution simple est meilleure. Il n'y a pas besoin d'exagérer. – nablik

0

Je n'ai aucune expérience avec Wicket. Mais est votre «classe de forme» (celle qui contient la méthode annotée avec @Transactional) code géré par ressort? c'est-à-dire qui crée les instances de la classe?

Si ce n'est pas le cas, Spring ne fournira pas le support @Transactional (le @Autowired ne fonctionnera pas non plus, etc.).

+0

@Transactional peut être utilisé à l'extérieur du conteneur Spring, par exemple sur la classe d'entité documentation. Mais j'ai fait quelque chose de mal, et ça ne marche pas. – nablik

+0

Reportez-vous à http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html#transaction-declarative-aspectj. Alors oui - vous avez raison, il faudrait ajouter le support '@ Transactional' pour le code non-Spring géré, mais toutes ces classes doivent encore subir une sorte de traitement par Spring (ce qu'ils appellent' spring-aspects.jar'). –

+0

J'essaye d'ajouter le traitement d'aspectj, mais cela ne fonctionne pas. Des sugestions pourquoi? – nablik