Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Weld/CDI的最佳调试技巧是什么?_Java_Java Ee 6_Cdi_Jboss Weld_Jsr330 - Fatal编程技术网

Java 使用Weld/CDI的最佳调试技巧是什么?

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

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

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

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

  • 扫描哪些类路径条目以及在哪里?结果如何
  • 哪些bean可用于哪一类的注射
  • 是什么导致一个给定的bean以后不被考虑?一个给定的罐子
换句话说,我需要更详细地了解决策过程。出于某种原因,Guice不需要这样做,可能是因为它没有那么神奇,也可能是因为错误消息非常好


您如何调试焊接应用程序,以及它有多大帮助?

我可以建议几个选项:

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

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

  • 尝试放置一个不同的实现(如果没有被应用服务器绑定的话)——例如
    OpenWebBeans
    。它的异常消息可能更好

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


我可以确认,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在这方面的发展吗?