You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 17:44:57