簡體   English   中英

注釋掉的 Facelets 代碼仍然調用 EL 表達式,如 #{bean.action()} 並導致 #{bean.action} 上的 javax.el.PropertyNotFoundException

[英]Outcommented Facelets code still invokes EL expressions like #{bean.action()} and causes javax.el.PropertyNotFoundException on #{bean.action}

我的 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> -->

然后它拋出以下異常:

javax.el.PropertyNotFoundException: Property 'takeScreenshot' not found on type monstage.test.com.ScreenShotBean
    at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:237)
    at javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:214)
    at javax.el.BeanELResolver.property(BeanELResolver.java:325)
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:85)
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
    at com.sun.faces.facelets.el.ELText$ELTextVariable.toString(ELText.java:217)
    at com.sun.faces.facelets.el.ELText$ELTextComposite.toString(ELText.java:157)
    at com.sun.faces.facelets.compiler.CommentInstruction.write(CommentInstruction.java:77)
    at com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:82)
    at com.sun.faces.facelets.compiler.UILeaf.encodeAll(UILeaf.java:183)
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:424)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)

當我用括號更改方法表達式時,

<!--        <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)
...

因此,它在注釋塊中評估 EL(可通過CommentInstruction識別)。 注釋塊被視為模板文本。 默認情況下,Facelets 也在模板文本中評估 EL #{} 就好像您在編寫<p>#{screenShotBean.takeScreenshot}</p>沒有任何 JSF 標記。

你有幾個選擇:

  1. 完全刪除評論塊。

  2. 通過在注釋中加前綴\\來轉義 EL 表達式

    \\#{screenShotBean.takeScreenshot}

    以免它們被評估。

  3. 將整個注釋塊包裹在<ui:remove> ,使其不會出現在組件樹中(也不會出現在生成的 HTML 輸出中)。

  4. 通過將以下上下文參數添加到web.xml來禁用 Facelets 解析所有注釋:

     <context-param> <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name> <param-value>true</param-value> </context-param>

    請注意,沒有任何評論會以這種方式在生成的 HTML 輸出中結束。

除了BalusC 已經提供選項之外,您還可以將屬性rendered="false"到您的commandLink

如果您有多個組件希望能夠快速切換,您可能需要考慮在 bean 中創建調試屬性或使用項目階段:

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

您還可以使用上下文參數跳過 web.xml 中的注釋。

這是參數:

javax.faces.FACELETS_SKIP_COMMENTS 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM