El código Facelets Outcommented todavía invoca expresiones EL como # {bean.action ()} y causa javax.el.PropertyNotFoundException en # {bean.action}

Tengo el siguiente fragmento de código en mi Facelet:

   

Funciona bien, pero cuando lo comente de esta manera,

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

entonces arroja la siguiente excepción:

 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) 

Cuando cambio la expresión del método con paréntesis como a continuación,

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

Entonces no lanza la excepción, pero todavía se invoca.

¿Cómo es esto causado y cómo puedo resolverlo?

Mire más de cerca el rastro de la stack. Aquí está la 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) ... 

Por lo tanto, está evaluando EL en un bloque de comentarios (reconocible por CommentInstruction ). Un bloque de comentarios se considera texto de plantilla. Facelets también evalúa por defecto EL #{} en el texto de la plantilla. Es como si estuvieras escribiendo

#{screenShotBean.takeScreenshot}

sin ninguna etiqueta JSF.

Tienes varias opciones:

  1. Elimina el bloque de comentarios por completo.

  2. Escape expresiones EL en el comentario prefijando con \ como en

     \#{screenShotBean.takeScreenshot} 

    para que no sean evaluados

  3. Envuelva todo el bloque de comentarios en para que no aparezca en el árbol de componentes (ni en el resultado HTML generado).

  4. Deshabilite el análisis de todos los comentarios por Facelets agregando el siguiente parámetro de contexto a web.xml :

      javax.faces.FACELETS_SKIP_COMMENTS true  

    Tenga en cuenta que ningún comentario terminará en el resultado HTML generado de esta manera.

Además de las opciones que BalusC ya proporcionó , también podría agregar el atributo rendered="false" a su commandLink .

Si tiene varios componentes que desea poder alternar rápidamente, es posible que desee considerar la creación de una propiedad de depuración en un bean o utilizar la etapa del proyecto:

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

También puede usar el parámetro de contexto que omite los comentarios en su web.xml.

Este es el parámetro:

 javax.faces.FACELETS_SKIP_COMMENTS 
    Intereting Posts