LocalXADataSource transactionManager NullPointerException
Hi, 你好! 不好意思,再次打扰。 我试着把bytetcc 集成到springboot的时候,我遇到了LocalXADataSource transactionManager NullPointerException,
请看现在配置和代码:
pom.xml
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.bytesoft</groupId>
<artifactId>bytetcc-common</artifactId>
<version>0.3.0</version>
</dependency>
<dependency>
<groupId>org.bytesoft</groupId>
<artifactId>bytetcc-supports</artifactId>
<version>0.3.0</version>
</dependency>
因为我是用的yml来配置的数据源,所以LocalXADataSource 的初始化是在代码里面做的,而不是在xml文件
@ConfigurationProperties(prefix = "spring.datasource.common")
@Bean
@Primary
@Qualifier(MAIN_DATA_SOURCE)
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@Qualifier(XA_DATA_SOURCE)
public LocalXADataSource localXADataSource(@Qualifier(MAIN_DATA_SOURCE) DataSource ds) {
LocalXADataSource dataSource = new LocalXADataSource();
dataSource.setDataSource(ds);
return dataSource;
}
@Bean
public JdbcTemplate jdbcTemplate(@Qualifier(XA_DATA_SOURCE) DataSource ds) {
return new JdbcTemplate(ds);
}
这段代码应该是和你示例代码XML配置等价的:
<bean id="mysql1" class="org.apache.commons.dbcp.BasicDataSource">
...
</bean>
<bean id="dataSource1" class="org.bytesoft.bytejta.supports.jdbc.LocalXADataSource">
<property name="dataSource" ref="mysql1" />
</bean>
<bean id="jdbcTemplate1" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource1" />
</bean>
但我在运行我的代码的时候,总是报
java.lang.NullPointerException: null
at org.bytesoft.bytejta.supports.jdbc.LocalXADataSource.getConnection(LocalXADataSource.java:54) ~[bytejta-supports-0.3.0.jar:na]
即
public class LocalXADataSource extends TransactionListenerAdapter
..
public Connection getConnection() throws SQLException {
TransactionXid transactionXid = null;
try {
54 Transaction transaction = (Transaction) this.transactionManager.getTransaction();
if (transaction == null) {
return this.dataSource.getConnection();
}
....
transactionManager is null
我试着设置一个transactionManager进去,但是springboot的是org.springframework.jdbc.datasource.DataSourceTransactionManager, 这个类不是javax.transaction.TransactionManager的子类,所以不能放进去. 我又试着初始化一个你实现的TransactionManagerImpl, 但是这个类需要一个TransactionBeanFactoryImpl 实例, 但TransactionBeanFactoryImpl实例又需要一个TransactionManagerImpl,这样就形成了一个环形依赖。不知道怎么来解决。 请问你能提供一下帮助吗?谢谢
还有就是用XML配置的时候,为什么没有这个异常呢?
LocalXADataSource中的transactionManager是通过TransactionManagerPostProcessor在启动时ByteTCC自动注入的; TransactionManagerImpl中的beanFactory,也是ByteTCC自动注入的(通过CompensableBeanFactoryPostProcessor)。
ByteTCC 0.3.0版本没有提供对springboot的默认支持,而且0.3.0版本的中心主要放在事务处理功能上,因此对注解配置的支持还不是特别完善。所以,尽量使用xml来配置吧。
非常感谢
幸好在这里看到了这个问题. 我本来也打算在Springboot上进行试验的.看来, 现在还是用xml吧.