27

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

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

我希望有一些开关可以轻松启用以下功能:

  • 扫描了哪些类路径条目以及在哪里扫描?结果如何?
  • 哪些 bean 可用于哪个类的注入?
  • 是什么导致给定的 bean 以后不考虑?给定的罐子?

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

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

4

3 回答 3

9

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

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

扫描了哪些类路径条目以及在哪里扫描?结果如何?

监听ProcessAnnotatedType-Event

哪些 bean 可用于哪个类的注入?

为此查询 BeanManager。

是什么导致给定的 bean 以后不考虑?给定的罐子?

收听AfterBeanDiscovery-Event 并查看 BeanManager 中的内容。基本上,以下情况会使 ManageBean 无法注入:

于 2011-05-07T10:15:56.680 回答
4

Weld uses Simple Logging for Java (sl4j). If you are using Tomcat, I suggest you add sl4j-jdk14-x.x.x.jar to application class path and append following lines to apache-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

This will generate lots of debug in console, so you`d better select something specific and comment out other lines.

Other logging libraries (like log4j) can be configured using their respective config files and adding similar levels.

于 2013-10-14T15:15:17.727 回答
3

我可以建议几个选项:

  • 降低日志记录阈值。我不知道 Weld 使用什么日志框架,但你可以看到并配置,比如说,DEBUG或者INFO

  • 获取源代码并在BeanManager实现中放置断点(BeanManagerImpl也许)。它是 CDI 中的主要类,几乎可以处理所有事情。

  • 尝试使用不同的实现(如果没有被应用程序服务器绑定) - 例如OpenWebBeans. 它的异常消息可能会更好

  • 打开规范并阅读特定案例。通常情况下,您错过了给定的先决条件 - 例如注释必须具有特定的@Target,否则 CDI 不会处理它。

我可以确认 Weld 的异常消息相当令人失望。我没有使用过 Guice,但在 Spring 中它们提供了非常非常有用的信息。对于 Weld,我必须参考上面的第四点(打开规范)并验证所有先决条件。这是我最初的怀疑——即使规范看起来非常好,实现也不会那么闪亮(至少一开始是这样)。但我想人们已经习惯了。

于 2011-01-31T20:45:16.547 回答