Java 使用Weld/CDI的最佳调试技巧是什么?
Java EE 6的优点之一是新的依赖注入框架——CDI和Weld参考实现——这促使我们开始以一种与实现无关的方式在内部迁移到JSR-330,明确的目标是能够拥有一个冻结的核心jar,然后能够添加额外的jar,提供新的模块来替换核心jar中的功能 我现在正在用Weld完成上述工作,坦率地说,封面后面有太多的魔法。它要么工作,要么不工作,默认情况下,它不会对发生的事情提供太多帮助,因此您可以调查错误并修复它 我希望有一些开关可以轻松实现以下功能:Java 使用Weld/CDI的最佳调试技巧是什么?,java,java-ee-6,cdi,jboss-weld,jsr330,Java,Java Ee 6,Cdi,Jboss Weld,Jsr330,Java EE 6的优点之一是新的依赖注入框架——CDI和Weld参考实现——这促使我们开始以一种与实现无关的方式在内部迁移到JSR-330,明确的目标是能够拥有一个冻结的核心jar,然后能够添加额外的jar,提供新的模块来替换核心jar中的功能 我现在正在用Weld完成上述工作,坦率地说,封面后面有太多的魔法。它要么工作,要么不工作,默认情况下,它不会对发生的事情提供太多帮助,因此您可以调查错误并修复它 我希望有一些开关可以轻松实现以下功能: 扫描哪些类路径条目以及在哪里?结果如何 哪些be
- 扫描哪些类路径条目以及在哪里?结果如何
- 哪些bean可用于哪一类的注射
- 是什么导致一个给定的bean以后不被考虑?一个给定的罐子
您如何调试焊接应用程序,以及它有多大帮助?我可以建议几个选项:
- 降低日志记录阈值。我不知道Weld使用的是什么日志框架,但您可以看到并配置,例如,
或DEBUG
INFO
- 获取源代码并在实现中放置断点(
maybe)。它是CDI中的主要类,处理几乎所有的事情BeanManagerImpl
- 尝试放置一个不同的实现(如果没有被应用服务器绑定的话)——例如
。它的异常消息可能更好OpenWebBeans
- 打开说明书,阅读特定案例。通常情况下,您会错过给定的先决条件-例如,注释必须具有特定的
,否则它将不由CDI处理@Target
我可以确认,Weld的异常消息相当令人失望。我没有用过Guice,但在春季它们的信息量非常非常大。对于焊接,我必须参考上述第4点(打开规范),并验证所有先决条件。这是我最初的怀疑——即使规范看起来很好,实现也不会那么闪亮(至少一开始是这样)。但是我想人们已经习惯了这一点。简短的回答:CDI没有专门的调试选项(因为规范中不需要这样的东西),Weld也没有专门的调试选项 长话短说:你可以自己做很多事情。熟悉一下,您会发现您可以轻松(真的!)编写自己的扩展来调试所需的信息 扫描和删除哪些类路径条目 哪里结果如何 收听
ProcessAnnotatedType
-事件
什么豆子可以注射
哪一节课
为此向BeanManager查询
是什么导致给定的bean不可用
以后考虑吗?一个给定的罐子
收听BeanDiscovery之后的事件,查看BeanManager中的内容。基本上,以下场景使ManageBean不符合注入条件:
- 它不是ManagedBean(就像jar中没有beans.xml一样)
- 它不符合托管bean()
- 它没有BeanType(
@Type{}
)
- 它被否决(焊缝焊接)或被任何其他延伸机制抑制
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)可以使用各自的配置文件进行配置,并添加类似的级别。我现在不受应用服务器的限制。这是如何在每个JSR-330提供者中实现“冻结核心jar+额外功能jar”的蓝图,我现在为CDI所做的工作。OpenWebBeans有更好的错误报告吗?您看过树脂中的CanDI实现吗?我的日志配置可能会切断调试日志,我会看看。我没有任何OWB或CanDI的经验。只焊接,实际上不要太多。例如,记录扫描的JAr文件。如果你错过了什么,那就制造一个JIRA问题。他们非常创新,我想他们会实现这些功能。很好的信息。你知道有谁写了一个“点击这里获取大量信息”模块,而不是我必须先做先决条件的研究吗?没有我知道的扩展。不过,这会对Seam/CODI做出很好的贡献……我认为它不起作用,因为您无法指定扩展的顺序。所以后来调用的扩展仍然可以改变游戏。我现在又遇到了问题。您熟悉新版本的Weld在这方面的发展吗?