gpt4 book ai didi

java - 如何将事务获取到 @PostConstruct CDI bean 方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:07:13 26 4
gpt4 key购买 nike

我正在试验 Java EE 7、CDI、JPA 和 JSF。

当 webapp 启动时,我想在我的 CDI bean(用@PostConstruct 标记)中运行一个初始化方法,它对数据库进行一些操作(插入一些行等)。为此,我需要一笔交易,但这并不像我预期的那么容易。

我已经尝试将@Transactional 注释添加到我的方法中,但显然它只适用于 EJB。我实际上尝试将我的 bean 转换为 EJB 而不是 CDI bean,但我仍然没有得到对我的 @PostConstruct 方法的事务处理。它适用于 bean 中的其他方法,但不适用于我的 @PostConstruct 初始化方法。

然后我阅读了有关创建方法拦截器以将事务获取到 CDI bean 的信息:

http://eubauer.de/kingsware/2012/01/16/cdi-and-transactions-e-g-in-jboss-7-0-2/

我也试过这个,但没有运气。它也不起作用。

那么如何将事务获取到 CDI bean 中的 @PostConstruct 初始化方法?

最佳答案

显然看起来:

In the @PostConstruct (as with the afterPropertiesSet from the InitializingBean interface) there is no way to ensure that all the post processing is already done, so (indeed) there can be no Transactions. The only way to ensure that that is working is by using a TransactionTemplate.

所以从@PostConstruct 对数据库做一些事情的唯一方法是做这样的事情:

@Service("something")
public class Something
{

@Autowired
@Qualifier("transactionManager")
protected PlatformTransactionManager txManager;

@PostConstruct
private void init(){
TransactionTemplate tmpl = new TransactionTemplate(txManager);
tmpl.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
//PUT YOUR CALL TO SERVICE HERE
}
});
}
}

注意:类似线程但引用 Spring 框架 @Transactional on @PostConstruct method

关于java - 如何将事务获取到 @PostConstruct CDI bean 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19876637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com