Jsf Outcommented Facelets代码仍然调用类似{bean.action()}的EL表达式,并在{bean.action}上引发javax.EL.PropertyNotFoundException
我的Facelet中有以下代码片段: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
<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'}"