开发者

Wicket with Spring declarative transaction

It is possible to use the Spring Framework's @Transactional support outside of a Spring container. In reference documentation is chapter about AspectJ aspect. I'm trying to use it in my wicket application, but with no positive result.

application-context.xml:

<tx:annotation-driven transaction-manager="transactionManager" mode="aspectj" />
<context:annotation-config />
<context:component-scan bas开发者_如何学JAVAe-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>

In my form class annotated by @Configurable, I have:

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

Stack trace:

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


You might be able to get this working using AspectJ load-time-weaving, but that's a very complex solution for a simple problem.

If you need declarative transactions, then I suggest you move the transactional logic from the wicket component down into a Spring bean, and invoke the Spring bean from the wicket object. The Spring bean would have the transactional annotations, and would be proxied correctly by the Spring container.


I have no experience with Wicket. But is your 'form class' (the one that contains method annotated with @Transactional) Spring managed code? i.e. Who creates the instances of the class?

If it's not, that Spring will not provide @Transactional support (neither will @Autowired work, etc).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜