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

标签 java logging jboss ejb

我的设置:

我有一个 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/

相关文章:

java - 不包括零的范围内的随机数

java - 日志应该多深?

Gradle Ear 插件 : Adding modules without version specifier

java - javadoc 和注释中的 Unicode?

java - 当我将 MainActivity 分成几个类时 Android 应用程序崩溃

当我合并使用 Log4j 2 的库时,java.util.logging 停止工作

java - Jboss AS 6.1.0 与 Java7 的握手超时

java - 我的 JBoss 使用什么版本的 HornetQ?

Java EE,整数给用户?

java (log4j) 按对象类型记录过滤器