gpt4 book ai didi

java - 在将 EJBTransactionRolledbackException 记录到文件之前捕获它

转载 作者:行者123 更新时间:2023-12-01 09:33:28 27 4
gpt4 key购买 nike

我的设置:

我有一个 EJB bean(部署在 JBoss 6.4 的耳朵中),其方法可以计算一些值并将其存储在数据库中。该方法在新事务中启动。它看起来像这样:

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void doStuff() {
MyObject value = calculateSomeValues();

entityManager.merge(value);
entitiyManager.flush();
}

根据设计,刷新可能会因 ConstraintViolationException 而失败。由于这是一个新事务,异常将被包装在 EJBTransactionRolledbackException 中并作为 RuntimeException 抛出。我已经为 ejb 异常设置了日志记录,因为在整个系统中查找它们很有用。然而,据我所知,ConstraintViolationException 会时不时地发生,我想在日志系统将其记录为错误之前捕获它并回滚(约束违规不被视为异常,但从数据库的角度来看,这是必需的)看法)。目前,我的日志文件中充满了这样的条目:

ERROR [org.jboss.as.ejb3.invocation] (default-threads - 49) JBAS014134: EJB Invocation failed on component

如何以阻止记录器打印这些错误的方式捕获异常? (注意:我仍然希望它记录所有其他 EJBTransactionRolledbackException)

最佳答案

我没有部署 JBoss 6,因此我无法立即测试精确的异常类型是否也适用于 JBoss 6(我在 WildFly 8 上尝试过)。

一个可能的解决方案是在您的 EJB 中放入一个由 @AroundInvoke 注释的方法(至少如果您在此 EJB 上没有其他拦截器的话):

   @AroundInvoke
public Object myConstraintViolationInterceptor(InvocationContext ctx) throws Exception
{
try {
return ctx.proceed();
}
catch(PersistenceException e) {
if (e.getCause() instanceof org.hibernate.exception.ConstraintViolationException) {
//some action taken
}
else {
throw e;
}
return null;
}
}

顺便说一句,如果您的 ConstraintViolationException 实际上是变相的乐观锁定异常(即,由于另一个用户同时修改了某些数据而抛出该异常),也许最好将其报告给用户。

关于java - 在将 EJBTransactionRolledbackException 记录到文件之前捕获它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39202160/

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