4000-520-616
欢迎来到免疫在线!(蚂蚁淘生物旗下平台)  请登录 |  免费注册 |  询价篮
主营:原厂直采,平行进口,授权代理(蚂蚁淘为您服务)
咨询热线电话
4000-520-616
当前位置: 首页 > 新闻动态 >
新闻详情
java – 如何找出异常导致CDI事务回滚的原因? - 程序园
来自 : www.voidcn.com/article/p-pdxid 发布时间:2021-03-25
}

一旦我们定义了CDI拦截器,我们就需要创建在使用Interceptor注释时执行的类.我们定义一个@AroundInvoke,以便在我们注释的方法中的代码之前调用我们的代码. invocationContext.proceed()将调用我们注释的方法,并向我们提供它返回的结果(如果有的话).所以我们可以在这个调用周围进行try,catch(Exception)来捕获任何抛出的异常.然后我们可以使用logger(此处使用的log4j)记录此异常,并重新抛出异常,以便任何上游代码也被告知它.

重新抛出异常也将允许我们使用CMT(容器管理事务),因为最终容器将捕获异常并抛出事务RollbackException.但是,您也可以轻松地使用UserTransactions,并在捕获异常时执行手动回滚,而不是重新抛出异常.

@Interceptor@TransactionDebuggerpublic class TransactionInterceptor { private Logger logger = LogManager.getLogger(); @AroundInvoke public Object runInTransaction(InvocationContext invocationContext) throws Exception { Object result = null; try { result = invocationContext.proceed(); } catch (Exception e) { logger.error(\"Error encountered during Transaction.\", e); throw e; return result;}

接下来,我们必须在beans.xml中包含新的Interceptor(通常位于src / META-INF中),因为CDI中默认情况下不启用拦截器.这必须在使用注释的所有项目中完成,而不仅仅是定义注释的项目.这是因为CDI基于每个项目初始化拦截器:

 ?xml version=\"1.0\" encoding=\"UTF-8\"?  beans xmlns=\"http://xmlns.jcp.org/xml/ns/javaee\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://xmlns.jcp.org/xml/ns/javaee  http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd\" version=\"1.1\" bean-discovery-mode=\"all\"  interceptors  class package.database.TransactionInterceptor /class  /interceptors  /beans 

最后,我们必须使用新的CDI Interceptor注释我们调用的方法.这里我们使用@Transactional来注释它们以启动事务,并使用@TransactionDebugger来捕获事务中发生的任何异常:

@Transactional @TransactionDebuggerpublic void init() {}

现在,这将记录执行init()代码时发生的任何错误.可以通过在Interceptor实现类TransactionInterceptor中将try,catch从Exception更改为Exception的子类来更改日志记录粒度.

本文链接: http://cdipdx.immuno-online.com/view-748626.html

发布于 : 2021-03-25 阅读(0)
公司介绍
联络我们
服务热线:4000-520-616
(限工作日9:00-18:00)
QQ :1570468124
手机:18915418616