【问题标题】:What are the best debugging tricks with Weld/CDI?Weld/CDI 的最佳调试技巧是什么?
【发布时间】:2011-06-18 12:35:04
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: java java-ee-6 cdi jboss-weld jsr330


    【解决方案1】:

    我可以建议几个选项:

    • 降低日志记录阈值。我不知道 Weld 使用什么日志框架,但您可以看到并配置,例如 DEBUGINFO

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

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

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

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

    【讨论】:

    • 我现在没有被应用服务器捆绑。这是我现在为 CDI 做的如何在每个 JSR-330 提供程序中执行“冻结核心 jar + 额外功能 jar”的蓝图。 OpenWebBeans 有更好的错误报告吗?你看过 Resin 中的 CanDI 实现吗?我的日志配置可能会截断DEBUG日志,我去看看。
    • 我对 OWB 或 CanDI 没有任何经验。只有焊接,实际上并没有太多。
    • OpenWebBeans 例如记录扫描的 JAr 文件。如果您遗漏了某些内容,请创建 JIRA 问题。他们非常有创意,我猜他们会实现这样的功能。
    【解决方案2】:

    简短回答:CDI 没有专门的调试选项(因为规范没有要求),Weld 也没有专门的调试选项。

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

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

    收听ProcessAnnotatedType-Event

    哪些豆类可用于注入 哪个班?

    为此查询 BeanManager。

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

    收听AfterBeanDiscovery-Event 并查看您在 BeanManager 中得到了什么。基本上,以下情况会使 ManageBean 无法注入:

    【讨论】:

    • 不错的信息。您是否知道有人编写了“将其放入并获取大量信息”模块,而不是我必须先进行先决条件研究?
    • 没有我知道的扩展名。虽然会为 Seam / CODI 做出很好的贡献......
    • 我认为它不起作用,因为您无法指定扩展的顺序。所以之后调用的扩展仍然可以改变游戏规则。
    • 我现在又遇到了这个问题。您是否熟悉 Weld 较新版本在该领域的任何开发?
    【解决方案3】:

    Weld 使用 Java 的简单日志记录 (sl4j)。如果您使用的是 Tomcat,我建议您将 sl4j-jdk14-x.x.x.jar 添加到应用程序类路径并将以下行附加到 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
    

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-27
      • 1970-01-01
      • 2010-10-06
      • 2020-12-12
      • 2010-09-30
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多