Java EE 6 的一大优点是新的依赖注入(inject)框架 - 带有 Weld 引用实现的 CDI - 这促使我们开始以与实现无关的方式在内部迁移到 JSR-330,其明确目标是能够拥有一个被卡住的核心 jar,然后能够添加额外的 jar,提供新的模块来替换核心 jar 中的功能。
我现在正在与 Weld 一起完成上述工作,坦率地说,幕后的魔法实在是太多了。它要么起作用,要么不起作用,并且默认情况下它不会对发生的事情提供太多帮助,因此您可以调查问题并修复它。
我希望有一些开关可以轻松启用以下功能:
- 扫描了哪些类路径条目以及在哪里扫描?结果如何?
- 哪些 bean 可用于哪个类的注入(inject)?
- 是什么导致给定的 bean 在以后不被考虑?给定的 jar ?
换句话说,我需要更详细地了解决策过程。出于某种原因,这不是 Guice 所需要的,可能是因为魔法少得多,也可能是因为错误消息非常好。
您如何调试 Weld 应用程序,它有多大帮助?
最佳答案
简短回答:CDI 没有专门的调试选项(因为规范没有要求),Weld 也没有专门的调试选项。
长答案:您可以自己做很多事情。熟悉extension mechanism of CDI ,您会发现您可以轻松(真的!)编写自己的扩展程序来调试所需信息
What classpath entries are scanned and where? What was the result?
监听ProcessAnnotatedType
-Event
What beans are available for injection for which class?
为此查询 BeanManager。
What caused a given bean not to be considered for later? A given jar?
收听 AfterBeanDiscovery
-Event 并查看您在 BeanManager 中得到了什么。基本上,以下情况会使 ManageBean 无法注入(inject):
- 它不是 ManagedBean(就像 jar 中没有 beans.xml)
- 它不符合托管 bean (https://docs.jboss.org/weld/reference/1.1.0.Final/en-US/html/beanscdi.html#d0e794) 的条件
- 它没有 BeanType (
@Type{}
) - 它被任何其他扩展机制否决(Seam Solder)或抑制
关于java - Weld/CDI 的最佳调试技巧是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4850215/