Spring Boot3+Java21下Atomikos6.0.0与Jakarta Transaction兼容问题
解决Spring Boot 3 + Atomikos 6.0.0的JTA兼容问题
核心问题原因
Spring Boot 3 依赖的 Spring TX 6.x 已完全迁移至 Jakarta EE 9+,所有JTA相关接口均位于jakarta.transaction包下;而Atomikos 6.0.0默认提供的transactions-jta、transactions-jdbc依赖仍基于旧的javax.transaction包,导致接口类型不兼容,无法直接注入到JtaTransactionManager中。
解决方案步骤
1. 替换Atomikos依赖为Jakarta兼容版本
将原pom.xml中的Atomikos依赖替换为专门的Jakarta适配版本:
<dependency> <groupId>com.atomikos</groupId> <artifactId>transactions-jdbc-jakarta</artifactId> <version>6.0.0</version> </dependency> <dependency> <groupId>com.atomikos</groupId> <artifactId>transactions-jta-jakarta</artifactId> <version>6.0.0</version> </dependency>
这些依赖提供了基于jakarta.transaction接口的Atomikos实现,完全适配Spring TX 6.x的要求。
2. 调整JTA配置类的导入与实现
修改配置类,使用Atomikos Jakarta包下的事务实现类,确保与Spring的JtaTransactionManager兼容:
import jakarta.transaction.UserTransaction; import jakarta.transaction.TransactionManager; import com.atomikos.icatch.jta.jakarta.UserTransactionImp; import com.atomikos.icatch.jta.jakarta.UserTransactionManager; import org.springframework.transaction.jta.JtaTransactionManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AtomikosJtaConfig { @Bean public UserTransaction userTransaction() { return new UserTransactionImp(); } @Bean(initMethod = "init", destroyMethod = "close") public TransactionManager transactionManager() { return new UserTransactionManager(); } @Bean public JtaTransactionManager platformTransactionManager() throws Throwable { return new JtaTransactionManager(userTransaction(), transactionManager()); } }
3. 适配数据源配置(若涉及)
如果项目中使用Atomikos管理数据源,需同时替换为Jakarta版本的AtomikosDataSourceBean:
import com.atomikos.jdbc.jakarta.AtomikosDataSourceBean; import javax.sql.DataSource; @Bean public DataSource firstDataSource() { AtomikosDataSourceBean dataSource = new AtomikosDataSourceBean(); dataSource.setUniqueResourceName("FirstDB"); dataSource.setXaDataSourceClassName("com.mysql.cj.jdbc.MysqlXADataSource"); // 配置XA数据源属性 Properties props = new Properties(); props.setProperty("user", "db_user"); props.setProperty("password", "db_pass"); props.setProperty("url", "jdbc:mysql://localhost:3306/first_db"); dataSource.setXaProperties(props); return dataSource; }
额外说明
- 若后续需要升级Atomikos版本,从6.1.x开始,Atomikos已将Jakarta作为默认实现,无需再区分
-jakarta后缀的依赖。 - 确保项目中不存在
javax.transaction相关的残留依赖,避免类加载冲突。
内容的提问来源于stack exchange,提问作者sergiopf
相关产品推荐
相关产品推荐

