如何获取@PostConstruct CDI bean方法的事务
我正在试验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-eg-in-jboss-7-0-2/
我也试过这个,但没有运气。 它也不起作用。
那么如何在CDI bean中获取@PostConstruct初始化方法的事务呢?
显然它似乎:
在@PostConstruct中(与InitializingBean接口中的afterPropertiesSet一样),无法确保所有后期处理都已完成,因此(实际上)可能没有事务。 确保其正常工作的唯一方法是使用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 } }); } }
注意:类似的线程,但在@PostConstruct方法上引用Spring框架@Transactional