焊接CDI不会记录异常,除非打开调试级别

时间:2017-02-03 16:34:10

标签: cdi weld jboss-weld

我们注意到,如果在处理CDI事件时抛出异常 - 例如使用@Observes(during = TransactionPhase.BEFORE_COMPLETION) - 如果日志级别高于DEBUG,则不会记录异常。

Weld记录这样简单的东西:

16:31:41,732 ERROR [org.jboss.weld.Event] WELD-000401 Failure while notifying an observer of event SomeEventDTO

来自Weld的DeferredEventNotification第85-86行显示问题:https://github.com/weld/core/blob/master/modules/jta/src/main/java/org/jboss/weld/module/jta/DeferredEventNotification.java

    } catch (Exception e) {
        EventLogger.LOG.asyncObserverFailure(metadata);
        EventLogger.LOG.catchingDebug(e);
    }

这是因为规范说异常及其堆栈跟踪不需要记录,或者这是因为Weld在处理异常方面相当(太)放松了。

有没有比使用try-catch块包装所有事件观察代码更好的解决方案?

注意:将org.jboss.weld.Event的标准日志级别设置为DEBUG会导致日志记录过多。每个发送的事件也会被记录:

17:47:14,088 DEBUG [org.jboss.weld.Event] WELD-000400 Sending event SomeEventDTO directly to observer [method] public com.foo.bar.BeanClass.methodName(SomeEventDTO)

1 个答案:

答案 0 :(得分:1)

现在我理解了你的问题(对不起之前的混淆),让我说清楚。

Weld似乎故意隐藏了错误消息。对任何记录都没有规范限制。就例外情况而言,规范仅描述应该爆炸的内容以及何时爆炸。

另外,您使用的是Weld JTA模块,我认为它不符合任何CDI规范部分(意味着其特定于Weld),因此无论如何它可能没有发言权。

现在解决方案,我认为您对日志记录有一个公平的意义,它并没有真正帮助。因此,我继续创建JIRA issue (WELD-2330)。由于这是3.x分支,因此应该很快修复。随意进入并发表意见或甚至做出贡献。