在Payara 4.1中静默滚动交易

时间:2017-08-07 15:12:17

标签: java java-ee logging transactions payara

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

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

无论哪种方式,只要我弄清楚如何抑制其中一个日志记录操作,我就会找到一种方法来阻止这三种操作。有没有人知道如何抑制这种日志记录?

1 个答案:

答案 0 :(得分: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实例时将它们包装到另一个异常中)。您还可以将事务标记为仅回滚。请务必小心使用。如果您不想要容器中的日志,则需要自己控制所有流量。