我们注意到,如果在处理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)
答案 0 :(得分:1)
现在我理解了你的问题(对不起之前的混淆),让我说清楚。
Weld似乎故意隐藏了错误消息。对任何记录都没有规范限制。就例外情况而言,规范仅描述应该爆炸的内容以及何时爆炸。
另外,您使用的是Weld JTA模块,我认为它不符合任何CDI规范部分(意味着其特定于Weld),因此无论如何它可能没有发言权。
现在解决方案,我认为您对日志记录有一个公平的意义,它并没有真正帮助。因此,我继续创建JIRA issue (WELD-2330)。由于这是3.x分支,因此应该很快修复。随意进入并发表意见或甚至做出贡献。