2011-01-31 101 views
22

Java EE 6中的美女之一是新的依赖注入框架 - 带有Weld参考实现的CDI - 它促使我们以实现不可知的方式在内部开始将内部迁移到JSR-330,明确的目标是能够有一个核心罐子被冻结,然后能够添加额外的罐子,提供替换核心罐子中的功能的新模块。Weld/CDI的最佳调试技巧是什么?

我现在正在与Weld进行上述工作,坦率地说,封面背后有太多的魔法。它可以工作,也可以不工作,并且默认情况下不会提供很多帮助,因此您可以调查出错的地方并修复它。

我希望有开关进行切换,可以轻松地启用了诸如:

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

换句话说,我需要更详细地看到决策过程。出于某种原因,Guice没有这样需要,也许是因为魔术少得多,并且可能是因为错误信息非常好。

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

回答

4

我可以建议几个选项:

  • 下记录的门槛。我不知道是什么日志框架所使用的焊接,但你可以看到和配置,比如说,DEBUGINFO

  • 获得源代码,并把断点在BeanManager实现(BeanManagerImpl也许)。它是CDI的主要课程,几乎处理所有事情。

  • 尝试放置不同的实现(如果不绑定应用程序服务器) - 例如OpenWebBeans。它的例外信息可能会更好

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

我可以确认Weld的异常消息相当令人失望。我没有使用过Guice,但是在Spring中它们非常非常丰富。随着焊接,我不得不参考上面的第4点(打开规格)并验证所有的先决条件。这是我最初的怀疑 - 即使规格看起来非常好,实现也不会如此闪亮(起初至少)。但我想一个人已经习惯了这一点。

+0

我不是由应用服务器捆绑现在。它是如何做到在每一个JSR-330提供了“冻结核罐子+额外的功能罐子”的蓝图,那我现在所做的CDI。 OpenWebBeans有更好的错误报告吗?你有没有看过Resin中的CanDI实现?我的日志记录配置可能会切断DEBUG日志,我会看看。 – 2011-01-31 21:00:43

+0

我还没有任何OWB或CanDI的经验。只有焊接,实际上并不太多。 – Bozho 2011-01-31 21:25:42

9

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

Long答案:你可以自己做很多事情。熟悉的extension mechanism of CDI,你会发现,你可以很容易地(真的!)写自己的扩展,调试您所需的信息

什么类路径条目被扫描和 在哪里?结果是什么?

ProcessAnnotatedType - 活动

什么豆类可用于注射 为哪一类?

查询的BeanManager了点。

什么导致给定的豆不被 考虑以后?给定的罐子?

AfterBeanDiscovery - 活动,看看您在BeanManager的本事。基本上,在以下情况下作出ManageBean没有资格注射:

3

焊接使用简单记录的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 

这将产生大量的控制台调试,所以you`d更好地选择具体的东西,并注释掉其他线。

其它测井库(比如​​log4j的)可以使用他们各自的配置文件以及添加相似的水平进行配置。

相关问题