Mit*_*ani 27 java spring spring-annotations spring-3
我正在使用@Configuration注释来配置spring而不是xml文件.我正在配置具有不同会话工厂和不同事务管理器的2个数据源.我在这里遇到了一个@EnableTransactionManagement注释问题.我在其文档中读到,
@EnableTransactionManagement更灵活; 它将回退到PlatformTransactionManager容器中任何bean 的类型查找.因此,名称可以是"txManager","transactionManager"或"tm":它无关紧要.
这意味着我给方法的任何名称,它总是会搜索返回PlatformTransactionManager对象的方法,而我有2个transactionmanagers.现在问题是,当我测试这个类时,它给了我错误:
org.springframework.beans.factory.NoSuchBeanDefinitionException:没有org.springframework.transaction.PlatformTransactionManager定义类型为[ ]的唯一bean :期望的单个bean但找到2
我甚至试图拥有2个不同的配置类但是徒劳无功.在xml配置中,情况并非如此.我用两个<tx:annotation-driven transaction-manager="" />标签注册了我的两个交易管理器,它运行正常.但是这里不能用注释做同样的事情.
如果我想在Spring注释配置类中配置2个具有2个不同事务管理器的数据源,我该怎么办?
Ang*_*gad 35
在配置类中,使用@EnableTransactionManagement注释.
在此类中定义事务管理器:
@Bean(name="txName")
public HibernateTransactionManager txName() throws IOException{
HibernateTransactionManager txName= new HibernateTransactionManager();
txName.setSessionFactory(...);
txName.setDataSource(...);
return txName;
}
Run Code Online (Sandbox Code Playgroud)
在您的类/方法中执行事务作业,注释如下:
@Transactional("txName")
Run Code Online (Sandbox Code Playgroud)
要么
@Transactional(value = "txName")
Run Code Online (Sandbox Code Playgroud)
这就是如何将名称限定的事务管理器绑定到您需要的位置.您现在可以拥有任意数量的事务管理器,并根据需要随时使用它.
万一有人遇到这个问题,我找到了一个解决方案:
@Configuration
@EnableTransactionManagement
@DependsOn("myTxManager")
@ImportResource("classpath:applicationContext.xml")
public class AppConfig implements TransactionManagementConfigurer {
@Autowired
private PlatformTransactionManager myTxManager;
...
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return this.myTxManager;
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以使用xml配置中定义的特定txManager.
如果你要定义的txManager服务级别时,你就删除了@EnableTransactionManagement从注释@Configuration类,并指定txManager的@Transactional注解,如
@Service
@Transactional(value="myTxManager", readOnly = true)
public class MyServiceImpl implements MyService { ... }
Run Code Online (Sandbox Code Playgroud)
来自java doc
对于那些希望在
@EnableTransactionManagement要使用的确切事务管理器bean 之间建立更直接关系的人,TransactionManagementConfigurer可以实现回调接口 - 注意下面的implements子句和@Override-annotated方法:
你的@Configuration类需要实现TransactionManagementConfigurer接口 - 实现annotationDrivenTransactionManager它将返回transactionManager应该使用的引用.
| 归档时间: |
|
| 查看次数: |
40751 次 |
| 最近记录: |