gpt4 book ai didi

java - TransactionManager 和注解的 Spring 3 问题

转载 作者:行者123 更新时间:2023-11-30 11:52:42 24 4
gpt4 key购买 nike

我正在尝试在我的 Web 应用程序(由 Spring MVC 3 提供支持)中设置一个 TransactionManager,因为我需要将组件的一种方法注释为 @Transactional.

这是我的情况:

  • web.xml:为 Spring ContextLoaderListener 加载 2 个 xml 文件(applicationContext.xmldatabase.xml)
  • applicationContext.xml:包含一些我无法通过注解定义的 beans,加上注解标签,加上通常的 context:annotation-config 和 context:component-scan(这个 component-scan 包括包含@Transactional 方法)
  • database.xml:包含数据源(我正在使用来自 commons-dbcp 的 BasicDataSource)、事务管理器定义和 tx:annotation-driven。

我有一个 @Component (DeleteComponent),它有一个接口(interface)和一个实现 (DeleteComponentImpl)。实现类用 @Component 注释,并且有一个用 @Transactional 注释的公共(public)方法(我注释了具体类而不是接口(interface),如 Spring 文档所述)。对于 @Transactional,我没有添加任何参数,因为默认值很好。此类有一些 DAO(用 @Repository 注释)通过 @Autowired 注入(inject)。我只使用普通的 JDBC(没有 Hibernate 或其他 ORM)。此 @Component 被注入(inject)到 @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"/>

应用程序仍然可以正确部署并且没有报错。

关于我应该检查什么以使其正常工作的任何提示?

谢谢。

最佳答案

我通过使用 @Transactional(rollbackFor = RuntimeException.class) 并从 BasicDataSource 切换到 c3p0 库中的 ComboPooled 来解决.感谢您的建议。

关于java - TransactionManager 和注解的 Spring 3 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6704746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com