2017-08-07 46 views
1

我有一个容器管理事务的EJB。我有一个方法(用作REST调用),它调用另一个EJB中我使用JNDI注入的东西(不确定是否重要),并且它返回一个扩展RuntimeException的Exception(因此它导致事务回滚),它通过ExceptionMapper转换为404响应。在Payara 4.1中无声地滚动事务

我想这个异常是从我的REST调用返回的,我不介意它在日志中,但我不希望我的日志被垃圾邮件引起的EJBExceptionRolledBackException堆栈跟踪(堆栈跟踪出于某种原因被打印三次)。我相信这三个堆栈跟踪中的两个会在服务器返回到REST调用的最终方法之前得到记录。

无论哪种方式,只要我找出如何抑制这些日志记录动作之一,我会找出一种方法来阻止所有这三种。有没有人有一个想法如何抑制这种记录?

回答

1

正如在EJB规范中所说的,每个SystemException都必须由容器实现记录。您可以尝试捕捉它或标记为ApplicationException,但如果标记它,它将不会回滚事务。我的建议是:

@Stateless 
@TransactionManagement(TransactionManagementType.BEAN) 
public class MyBean { 

    @Resource 
    private UserTransaction tx; 

    public void myMethod() throws MyApplicationException { 
     try { 
      tx.begin(); 
      // call needed methods 
      tx.commit(); 
     } catch(Exception e) { 
      // silently rollback; 
      // exceptions from `UserTransaction` omitted for readability 
      tx.rollback(); 
      throw new MyApplicationException(e); 
     } 
    } 
} 

现在在EJB的客户端代码,你可以作出反应MyApplicationException并返回任何你想要的或登录,或没有。通过使用容器管理的事务将确保错误按规范进行记录(并且在bean实例被销毁时将它们封装到另一个异常中)。您也可以将事务标记为仅回滚。一定要小心使用。如果你不想从容器中记录日志,你需要自己控制所有的流程。

+0

谢谢!我希望只有一些我可以触发的日志记录标志或什么,因为毕竟这只是关于日志记录,而没有别的,但我会考虑改变这种处理方式。 我会看看是否保留容器管理的事务,但不提交任何事情,并抛出ApplicationException将工作。并指定该方法抛出异常将强制任何调用该方法来处理它,并希望他们会记得在需要时回滚事务。 – SpooXter

+0

我建议检查有关交易的规格。值得一读) –