Wicket with Spring声明式事务

时间:2010-01-12 22:34:05

标签: spring jpa transactions wicket aspectj

可以在Spring容器之外使用Spring Framework的@Transactional支持。在参考文档中有关于AspectJ方面的章节。我试图在我的wicket应用程序中使用它,但没有积极的结果。

应用程序的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>

在我的@Configurable注释的表单类中,我有:

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

堆栈追踪:

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

2 个答案:

答案 0 :(得分:4)

可能能够使用AspectJ load-time-weaving来实现这一点,但对于一个简单的问题,这是一个非常复杂的解决方案。

如果您需要声明式事务,那么我建议您将事务逻辑从wicket组件下移到Spring bean中,并从wicket对象调用Spring bean。 Spring bean将具有事务注释,并且将由Spring容器正确代理。

答案 1 :(得分:0)

我对Wicket没有经验。但是你的'表单类'(包含用@Transactional注释的方法的那个)Spring托管代码?即谁创建了班级的实例?

如果不是,则Spring不会提供@Transactional支持(@Autowired也不会提供支持等。)