如何调试JSF/EL

mrz*_*asa 44 eclipse debugging jsf el jsf-2

如何在JSF页面中调试EL?我想看变量值,函数调用等等.最好的解决方案是eclipse插件,但任何其他可能性都比猜测"为什么这个表达式无法正确呈现?"更好.

Bal*_*usC 69

最接近JSF/Facelets可以<ui:debug />在视图中放置一个地方:

<ui:debug />
Run Code Online (Sandbox Code Playgroud)

CtrlShiftD然后按下应显示一个弹出窗口,其中包含有关组件树和所有可用请求参数以及请求/视图/ flash /会话/应用程序作用域变量的调试信息.它基本上是所有这些地图内容的表示.

热键是按hotkey属性配置的方式,这样您可以选择另一个与浏览器默认热键冲突的方式,就像在Firefox中一样; CtrlShiftD默认情况下会显示添加书签对话框.以下是您可以如何进行聆听CtrlShiftX:

<ui:debug hotkey="x" />
Run Code Online (Sandbox Code Playgroud)

您通常也希望将其隐藏在非开发阶段,因此添加一个渲染条件:

<ui:debug hotkey="x" rendered="#{facesContext.application.projectStage == 'Development'}" />
Run Code Online (Sandbox Code Playgroud)

在显示的调试信息中,提供的有关范围变量的信息并不像您期望的那么好.它仅显示Object#toString()默认的所有范围变量的结果com.example.Bean@hashcode.您无法直接探索其属性及其属性的值,就像在Eclipse的调试器的调试视图中一样.您需要相应地toString()在类上实现,以便尽可能多地返回相关信息(如果需要,您甚至可以通过右键单击源代码> Source> Generate toString()来让Eclipse自动生成它:):

@Override
public String toString() {
    return String.format("Bean[prop1=%s,prop2=%s,prop3=%s]", prop1, prop2, prop3);
}
Run Code Online (Sandbox Code Playgroud)

至于方法调用,只需按常规方式在Java源代码上放置一个断点.当EL调用该方法时,Eclipse也会在那里启动.如果它是托管bean,您还将在Eclipse调试器中看到它的属性.

  • @Murat:从所需`UIComponent`类的`encodeAll()`方法的断点开始. (4认同)
  • 嗨BalusC,我想问一个类似的问题,但似乎最好在这里发布...我在你的博客上关注你的`Debug JSF lifecycle`文章.除了你在这里和那篇文章中提出的调试机制之外,是否可以深入研究JSF实现源?我对标签的看法有问题.渲染不是预期的,我无法理解为什么它是这样的.我想进入JSF源码.它是否有意义,如果愿意,你能指出我的资源开始吗? (2认同)

小智 6

如果您确实遇到问题,那么如果您可以获得EL实现的源代码(对于RI来说足够简单),那么您可以使用Eclipse在EL实现方法中设置断点.你需要得到的EL代码是如何工作的理解,但它不是那个复杂.不是因为非常胆小的人.

另一种可能性是以编程方式创建和评估EL.有一些如何做到这一点的例子.然后,您可以使用调试器来解决表达式是什么以及结果是什么,直到您解决了问题所在.