2012-07-31 19 views
7

Estoy tratando de mostrar un bloque solo si hay mensajes globales en la cola JSF.JSF usando EL para probar la presencia de mensajes globales

Intenté usar rendered="#{not empty facesContext.getMessageList(null)}", pero siempre se evalúa como falso.

La única forma que encontré es crear una función EL personalizada y probarla en java.

por ejemplo. : mi EL función: la página

public static boolean isFacesGlobalMessages() { 
    return ! FacesContext.getCurrentInstance().getMessageList(null).isEmpty(); 
} 

JSF:

<h:panelGroup class="block1" layout="block" rendered="#{el:isFacesGlobalMessages()}"> 
    <div class="block-warn-body"> 
    <rich:messages id="msg" globalOnly="true"/> 
    </div> 
</h:panelGroup> 

estoy usando Mojarra 2.1.5.

Me estoy perdiendo algo? Gracias!

Editar: probado las siguientes sugerencias, pero sin suerte hasta ahora:

  • #{not empty facesContext.getMessageList(null)} -> siempre falsas
  • #{! facesContext.getMessageList(null)} -> error
  • #{! empty facesContext.getMessageList(null)} -> siempre falsas
  • #{fn:length(facesContext.getMessageList(null)) > 0} -> siempre falso
  • #{not empty facesContext.messageList(null)} -> Error: Método mensajeLista no encontrada
  • #{not empty facesContext.messageList} -> devuelve cierto si se trata de un error de validación (que sólo quieren cierto en caso de error global)
  • #{! facesContext.getMessageList(null).isEmpty()} -> tiros IllegalAccessException: Clase javax.el.BeanELResolver no puede acceder a un miembro de la clase java.util.Collections $ UnmodifiableCollection con modificadores de "público"
+0

¿Intentó escribirlo de la misma manera que en su función? EL es consciente de! operador. – Paranaix

+0

¡Gracias! Acabo de probar (ver la edición anterior), pero no funcionó – gonzalad

+0

@gonzalad, no sé si es bueno para usted, pero actualicé mi respuesta ... – Daniel

Respuesta

18

sin necesidad de encargo función EL

probar esto

rendered="#{not empty facesContext.messageList}" 

EDITAR

no lo he probado a mí mismo, pero trate

rendered="#{not empty facesContext.messageList(null)}" 

Una idea ...

rendered="#{not facesContext.validationFailed and not empty facesContext.messageList}" 
+1

El 'FacesContext # getMessageList()' devuelve ** todos ** mensajes, también los mensajes no globales. – BalusC

+0

Intenté # {no empty facesContext.messageList (null)} pero genera una excepción (consulte la edición anterior para obtener más información) – gonzalad

+0

en caso de que desee identificar la situación cuando recibió mensajes en la lista de mensajes y ningún error de validación al mismo tiempo, eche un vistazo a mi respuesta editada .... – Daniel

1

Prueba esto:

rendered="#{not empty facesContext.getMessageList(null)} 

en lugar de:

rendered="#{not empty facesContext.messageList(null)}" 

en la respuesta de Daniel.

O esta otra:

rendered="#{not empty facesContext.getMessageList('inputForm')} 

donde 'inputform' es:

<h:form id="inputForm"> 
... 
</h:form> 

si quieres que se dirija a sólo una de las varias formas en su página.

1

Sé que este es un hilo viejo, pero después de luchar buscando una solución difícil de encontrar, encontré una explicación para este comportamiento, y como no puedo encontrar esta explicación en ningún lado (no sé por qué), creo que podría ser útil.

I hizo una función el diferente leve:

public static boolean hasMessages(String clientId) { 
    return !FacesContext.getCurrentInstance().getMessageList(clientId).isEmpty(); 
} 

La diferencia es el parámetro clientId. El comportamiento de esta función es exactamente el mismo que usar #{not empty facesContext.getMessageList(clientId)}. Depurando el código, noté que cuando llamé a la función con clientId = null, el valor de clientId dentro de la función en realidad es "" (cadena vacía).

Después de eso, consultado por el EL 3.0 Spec, y encontró:

Sección 1.23 - Conversión de tipo

Cada expresión se evalúa en el contexto de un tipo esperado. El resultado de la evaluación de expresión puede no coincidir exactamente con el tipo esperado, por lo que se aplican las reglas descritas en las siguientes secciones. [...]

Sección 1.23.2 - coaccionar a una cadena

Si A es nulo: return "" [...]

Por lo tanto, no crea que haya una forma de solicitar mensajes con clientId = null pasando el valor null como parámetro. La única forma es tener una función que lo haga sin usar un parámetro o probar si el parámetro se estableció en la cadena vacía.

+0

Buena captura. Este es un error conocido en Oracle EL impl y se corrigió en a.o. WildFly 8.2/GlassFish 4.1 y más nuevos. Tomcat luego reintrodujo el mismo error en Apache EL que nunca se "arregló" y requiere un sistema de resolución EL personalizado. Relacionado: http://balusc.omnifaces.org/2015/10/the-empty-string-madness.html – BalusC

+0

@BalusC En realidad estoy usando Glassfish 4.1 con Oracle EL impl (v. 3.0.1-b03). Tal vez no se considera un error porque está en la especificación, pero es terrible estar seguro de estar obligado a implementar funciones personalizadas/resolutores solo para hacer cosas simples como esta. – Luciano

+0

Se corrigió en 3.0.1-b05. Quizás está en 4.1.1 en su lugar. – BalusC

Cuestiones relacionadas