当前位置: 首页 > 知识库问答 >
问题:

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

佘京
2023-03-14

我正在试验JavaEE7、CDI、JPA和JSF。

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

我曾尝试将@Transactional注释添加到我的方法中,但显然它只适用于EJB。实际上,我尝试将bean转换为EJB而不是cdibean,但仍然没有将事务转换到@PostConstruct方法。它与bean中的其他方法一起工作,但与我的@PostConstruct初始化方法不同。

然后我读到关于创建方法拦截器来获取CDI bean的事务:

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

我也试过了,但是运气不好。它也不起作用。

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

共有1个答案

宇文卓
2023-03-14

显然,似乎:

在@PostConstruct中(与来自InitializingBean接口的AfterPropertieSet一样),无法确保所有的后处理都已经完成,因此(实际上)不可能有任何事务。确保该功能正常工作的唯一方法是使用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方法

 类似资料:
  • 在我的flutter项目里一个页面在播放mp3文件,当app滑至后台时音频还是会继续播放?请问如何能够实现当app后台时暂停播放,打开时继续播放?

  • 我们已经整合贝宝支付网关在我们的网站和交易是工作良好的沙盒帐户在INR(不是美元)。但在支付成功后,paypal重定向到我们的网站,并在其上附加重定向url和查询字符串,如paymentId、token、PayerID,我们还从C#代码中获得交易ID。

  • 使用(TransactionScope范围=new TransactionScope()){q.put(putMsg,pmo);scope.complete();} Q.关闭();qmgr.disconect();} 在我的代码中,这看起来像: null null

  • 我正在尝试整合payumoney支付网关在我的网站。我能完成交易。然而,我正在寻找一种方法,以获得已被收取的金额作为交易费的一个特定的交易。我在payumoney服务器在交易成功后发送的交易响应对象中找不到此字段,请帮助我。 示例: 响应对象:{“Country”:“”,“UDF10”:“”,“Discount”:“0.00”,“CardToken”:“789CE930DF72D5693ADFC”

  • 在早期版本的Kafka中,在消费者组不匹配期间,事务id和主题分区之间应该有一次语义静态映射,事务id有可能得到不同的主题分区。 为了避免这种情况,KIP-447:Producer scalability只实现了一次语义,我从KIP-477中了解到,旧的Producer在一个新API(sendOffsetToProdcuer)的帮助下使用fetch offset调用进行了保护,所以transact

  • 我想知道如何从贝宝API v2获取交易ID。 我已经通过PayPal API v2创建了一个订单(https://developer.paypal.com/docs/api/orders/v2/)并成功地捕获了它。订单的状态为“已完成”,订单已出现在我的PayPal沙箱帐户中的活动中,如我所料。现在我想获取捕获事务的事务ID(见图),但我无法获取它。 我通过PayPalAPI获得订单的详细信息,但