我想在我的Web應用程序(由Spring MVC 3提供支持)中設置一個TransactionManager,因爲我需要一個註釋爲@Transactional的組件方法。TransactionManager和註解彈簧3問題
這是我的情況:
- web.xml中:爲Spring的ContextLoaderListener(applicationContext.xml中和database.xml)
- applicationContext.xml的負載2 XML文件:包含一些豆類,我可以」 t通過註釋定義,加上註解的標籤,加上通常的上下文:註釋配置和上下文:組件掃描(這個組件掃描包括包含@Transactional方法的包)
- database.xml:包含數據源(我使用commons-dbcp的BasicDataSource),事務管理器定義和tx:annotat離子驅動。
我有一個@Component(DeleteComponent),它有一個接口和一個實現(DeleteComponentImpl)。實現類用@Component註釋,並且有一個公共方法用@Transactional註解(我註釋了具體類而不是接口,如Spring文檔所述)。對於@Transactional我沒有提出任何參數,因爲默認情況很好。這個類有一些DAO(用@Repository註解)通過@Autowired注入。我只使用普通的JDBC(沒有Hibernate或其他ORM)。這個@Component被注入一個@Controller(在spring-servlet.xml中定義)。
但是,如果註解爲@Transactional的方法拋出異常(未選中,如RuntimeException),則不會回滾任何內容。數據庫在異常之前保留更改。我使用Jetty Web服務器在本地測試我的應用程序。我注意到的事實是,似乎沒有設置事務管理器。實際上,我的事務管理器被命名爲「transactionManager」。該XML行成立註解驅動的事務是
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
如果我改變它使用一個不存在的bean的名字一樣
<tx:annotation-driven transaction-manager="fake"/>
應用程序仍然部署正確,不抱怨。
我應該檢查哪些技巧以使其工作?
謝謝。
爲什麼不從您的主appcontext.xml導入database.xml?如何在spring-servlet.xml中定義appcontext?組件掃描基礎包與您的impl類的包相匹配? – abalogh