0

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

应用程序上下文.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.
4

2 回答 2

4

也许可以使用 AspectJ load-time-weaving来完成这项工作,但对于一个简单的问题,这是一个非常复杂的解决方案。

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

于 2010-01-12T22:43:42.663 回答
0

我没有使用 Wicket 的经验。但是您的“表单类”(包含用 注释的方法@Transactional)是 Spring 托管代码吗?即谁创建了类的实例?

如果不是,Spring 将不会提供@Transactional支持(两者都不会@Autowired工作,等等)。

于 2010-01-12T22:44:26.077 回答