Weld/CDI 的最佳调试技巧是什么?

2022-09-01 14:46:12

Java EE 6的优点之一是新的依赖注入框架 - CDI与Weld参考实现 - 这促使我们开始以与实现无关的方式在内部迁移到JSR-330,其明确目标是能够拥有一个被冻结的核心jar,然后能够添加额外的jar,提供新的模块替换核心jar中的功能。

我现在正在与Weld进行上述工作,坦率地说,在幕后有太多的魔力在发生。它要么有效,要么不起作用,默认情况下,它不会对发生的事情提供太多帮助,因此您可以调查错误并修复它。

我希望有开关可以轻松地实现以下功能:

  • 扫描哪些类路径条目以及扫描位置?结果如何?
  • 哪些豆类可用于注射哪个类?
  • 是什么原因导致一个给定的豆子没有被考虑在以后?一个给定的罐子?

换句话说,我需要更详细地了解决策过程。由于某种原因,这并不是Guice所需要的,也许是因为魔术少得多,也许是因为错误消息非常好。

您如何调试 Weld 应用,它有多大帮助?


答案 1

简短的回答:CDI没有专用的调试选项(因为规范不需要这样的东西),Weld也没有专用的调试选项。

长答案:你可以自己做很多事情。熟悉 CDI 的扩展机制,您会发现您可以轻松(真的!)编写自己的扩展来调试所需的信息

扫描哪些类路径条目以及扫描位置?结果如何?

收听 -事件ProcessAnnotatedType

哪些豆类可用于注射哪个类?

查询 BeanManager 以获取该信息。

是什么原因导致一个给定的豆子没有被考虑在以后?一个给定的罐子?

收听 -Event,看看您在 BeanManager 中得到了什么。基本上,以下情况使 ManageBean 不符合注入的条件:AfterBeanDiscovery


答案 2

Weld 使用 Simple Logging for Java (sl4j)。如果您使用的是Tomcat,我建议您添加到应用程序类路径中,并将以下行附加到:sl4j-jdk14-x.x.x.jarapache-tomcat-7.0.x/conf/logging.properties

org.jboss.weld.Bootstrap.level = FINEST 
org.jboss.weld.Version.level = FINEST 
org.jboss.weld.Utilities.level = FINEST 
org.jboss.weld.Bean.level = FINEST 
org.jboss.weld.Servlet.level = FINEST 
org.jboss.weld.Reflection.level = FINEST 
org.jboss.weld.JSF.level = FINEST 
org.jboss.weld.Event.level = FINEST 
org.jboss.weld.Conversation.level = FINEST 
org.jboss.weld.Context.level = FINEST 
org.jboss.weld.El.level = FINEST 
org.jboss.weld.ClassLoading.level = FINEST

这将在控制台中生成大量调试,因此您最好选择特定内容并注释掉其他行。

其他日志记录库(如 log4j)可以使用其各自的配置文件进行配置并添加类似的级别。


推荐