Jsf Outcommented Facelets代码仍然调用类似{bean.action()}的EL表达式,并在{bean.action}上引发javax.EL.PropertyNotFoundException

Jsf Outcommented Facelets代码仍然调用类似{bean.action()}的EL表达式,并在{bean.action}上引发javax.EL.PropertyNotFoundException,jsf,comments,el,facelets,propertynotfoundexception,Jsf,Comments,El,Facelets,Propertynotfoundexception,我的Facelet中有以下代码片段: <h:commandLink id="cmdbtn"> <f:ajax event="click" execute="@form" listener="#{screenShotBean.takeScreenshot}" /> </h:commandLink> 当我更改带括号的方法表达式时,如下所示 <!-- <h:commandLink id="cmdbtn"&g

我的Facelet中有以下代码片段:

<h:commandLink id="cmdbtn">
    <f:ajax event="click" execute="@form"
            listener="#{screenShotBean.takeScreenshot}" />
</h:commandLink>
当我更改带括号的方法表达式时,如下所示

<!--        <h:commandLink id="cmdbtn"> -->
<!--            <f:ajax event="click" execute="@form" -->
<!--                    listener="#{screenShotBean.takeScreenshot()}" /> -->
<!--        </h:commandLink> -->
然后不会抛出异常,但仍会调用它


这是如何造成的,我如何解决它?

仔细查看堆栈跟踪。以下是相关部分:

...
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
com.sun.faces.facelets.el.ELText$ELTextVariable.toString(ELText.java:217)
com.sun.faces.facelets.el.ELText$ELTextComposite.toString(ELText.java:157)
com.sun.faces.facelets.compiler.CommentInstruction.write(CommentInstruction.java:77)
...
因此,它在CommentInstruction可识别的注释块中计算EL。注释块被视为模板文本。默认情况下,Facelets在模板文本中也计算EL{}。这就像你在写{screenShotBean.takeScreenshot}

而没有任何JSF标记一样

您有几种选择:

完全删除注释块

通过在注释前面加上\as in来转义注释中的EL表达式

这样他们就不会被评估了

包装整个注释块,使其不会出现在组件树或生成的HTML输出中

通过向web.xml添加以下上下文参数,禁用Facelets对所有注释的解析:

请注意,没有任何注释会以这种方式在生成的HTML输出中结束


还可以使用上下文参数跳过web.xml中的注释

这是标准表:

javax.faces.FACELETS_SKIP_COMMENTS 
除此之外,还可以将属性rendered=false添加到commandLink

如果您希望快速切换多个组件,您可能需要考虑在Bean中创建调试属性或使用项目阶段:

rendered="#{facesContext.application.projectStage == 'Development'}"

顺便说一句,我试图通过将所有元素finishing by/>更改为完整的符号形式来解决此问题,但没有成功。我使用了建议的选项4并修复了propertyNotFoundException的问题。非常感谢。
\#{screenShotBean.takeScreenshot}
<context-param>
    <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
    <param-value>true</param-value>
</context-param>
javax.faces.FACELETS_SKIP_COMMENTS 
rendered="#{facesContext.application.projectStage == 'Development'}"