2010-01-12 39 views
0

可以在Spring容器之外使用Spring框架的@Transactional支持。參考文檔是關於AspectJ方面的章節。我試圖在我的Wicket應用程序中使用它,但沒有正面結果。Wicket with Spring declarative transaction

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

回答

4

可能能夠使用AspectJ load-time-weaving獲得此工作,但對於一個簡單問題來說,這是一個非常複雜的解決方案。

如果您需要聲明式事務,那麼我建議您將事務邏輯從檢票組件移到Spring bean中,並從檢票對象中調用Spring bean。 Spring bean將具有事務註釋,並且將由Spring容器正確代理。

+0

是的,我的錯。這個簡單的解決方案更好。沒有必要誇大。 – nablik 2010-01-13 08:16:59

0

我沒有Wicket的經驗。但是你的'表單類'(包含方法註釋的方法)@Transactional Spring託管代碼?即誰創建了該類的實例?

如果不是,Spring將不會提供@Transactional支持(@Autowired工作等都不會)。

+0

@Transactional可以在Spring容器之外使用,例如在實體類documentation上。但是我做錯了什麼,它不起作用。 – nablik 2010-01-13 08:11:10

+0

你在引用http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html#transaction-declarative-aspectj。然後是的 - 你是對的,它會爲非Spring託管代碼添加'@ Transactional'支持,但所有這些類仍然需要經過Spring的某種處理(他們稱之爲'spring-aspects.jar')。 – 2010-01-13 10:49:06

+0

我試圖添加aspectj處理,但它不起作用。任何sugestions爲什麼? – nablik 2010-01-13 13:03:38