O código de Facelets fora de conjunto ainda invoca expressões EL como # {bean.action ()} e causa javax.el.PropertyNotFoundException em # {bean.action}

Eu tenho o seguinte trecho de código no meu Facelet:

   

Funciona bem, mas quando eu gosto disso,

 <!--  --> <!--   <!--  --> 

então lança a seguinte exceção:

 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) 

Quando eu mudo a expressão do método com parênteses como abaixo,

 <!--  --> <!--   <!--  --> 

Em seguida, não lança a exceção, mas ainda é invocado.

Como isso é causado e como posso resolvê-lo?

   

Olhe mais de perto o rastreio da pilha. Aqui está a parte relevante:

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

Assim, está avaliando EL em um bloco de comentário (reconhecível por CommentInstruction ). Um bloco de comentário é considerado como texto de modelo. O Facelets avalia por padrão também o EL #{} no texto do modelo. É como se você estivesse escrevendo

#{screenShotBean.takeScreenshot}

sem nenhuma tag JSF.

Você tem várias opções:

  1. Remova o bloco de comentário completamente.

  2. Escape as expressões EL no comentário prefixando-as com \ as em

     \#{screenShotBean.takeScreenshot} 

    para que eles não sejam avaliados.

  3. Envolva todo o bloco de comentários em para que ele não apareça na tree de componentes (nem na saída HTML gerada).

  4. Desative a análise de todos os comentários por Facelets incluindo o seguinte parâmetro de contexto em web.xml :

      javax.faces.FACELETS_SKIP_COMMENTS true  

    Note que nenhum comentário terminará na saída HTML gerada dessa maneira.

Além das opções que o BalusC já forneceu, você também pode adicionar o atributo rendered="false" ao seu commandLink .

Se você tiver vários componentes que deseja alternar rapidamente, convém criar uma propriedade de debugging em um bean ou usar o estágio do projeto:

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

Você também pode usar o parâmetro de contexto que pula os comentários no seu web.xml.

Este é o medidor de ponto:

 javax.faces.FACELETS_SKIP_COMMENTS