Spring Boot迁移EJB项目时SessionContext对象的替代方案是什么?
问题解决方案
Spring 生态没有内置 javax.ejb.SessionContext 的兼容实现,你用到的标记当前事务强制回滚的能力,直接使用 Spring 事务管理的内置组件即可实现,常用两种实现方案:
方案1:使用 TransactionAspectSupport(推荐,无额外注入成本)
直接删除原 SessionContext 注入代码,业务逻辑位置替换为以下代码即可实现完全等效的效果:
import org.springframework.transaction.interceptor.TransactionAspectSupport; // 原判断逻辑位置 if (some condition) { // 等效于原sessionContext.setRollbackOnly()的功能 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return false; }
注意要点:
- 该方法仅可在标注了
@Transactional注解、被 Spring 事务托管的方法内调用,否则会抛出找不到当前事务的异常 - 标记事务仅回滚后,当前事务结束时会自动触发回滚,无需额外处理
方案2:使用 TransactionStatus(适合手动管控事务场景)
如果你采用手动管理事务的模式,可以通过事务管理器直接获取 TransactionStatus 对象调用回滚标记方法:
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; // 注入Spring事务管理器 @Autowired private PlatformTransactionManager transactionManager; public boolean yourBizMethod() { DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus status = transactionManager.getTransaction(def); try { if (some condition) { status.setRollbackOnly(); transactionManager.commit(status); return false; } // 其余业务逻辑 transactionManager.commit(status); return true; } catch (Exception e) { status.setRollbackOnly(); transactionManager.rollback(status); throw e; } }
额外配置验证
- 确认项目已经引入事务依赖:
spring-boot-starter-jdbc、spring-boot-starter-data-jpa等 starter 都会自动引入spring-tx事务依赖,无需额外引入 - 确认启动类/配置类上添加了
@EnableTransactionManagement注解开启事务管理能力,否则@Transactional注解不会生效 - 无需尝试自行定义
SessionContext类型的 Bean,强行引入 EJB 依赖只会增加不必要的兼容性问题
内容的提问来源于stack exchange,提问作者mahfuj asif
相关产品推荐
相关产品推荐

