2012-07-31 13 views
7

Próbuję wyświetlić blok tylko wtedy, gdy istnieją globalne wiadomości w kolejce JSF.JSF za pomocą EL do testowania obecności wiadomości globalnych

Próbowałem użyć rendered="#{not empty facesContext.getMessageList(null)}", ale zawsze jest to wartość false.

Jedynym sposobem, jaki znalazłem, jest utworzenie niestandardowej funkcji EL i przetestowanie jej w języku Java.

np. : moja funkcja el: Strona

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> 

Używam Mojarra 2.1.5.

Czy brakuje mi czegoś? Dzięki!

Edycja: próbowałem następujące propozycje, ale nie ma szczęścia do tej pory:

  • #{not empty facesContext.getMessageList(null)} -> zawsze fałszywe
  • #{! facesContext.getMessageList(null)} -> Błąd
  • #{! empty facesContext.getMessageList(null)} -> zawsze fałszywe
  • #{fn:length(facesContext.getMessageList(null)) > 0} -> zawsze false
  • #{not empty facesContext.messageList(null)} -> Błąd: nie znaleziono metody messageList
  • #{not empty facesContext.messageList} -> zwraca wartość true, jeśli jest to błąd sprawdzania poprawności (Chcę tylko prawda o globalnym błędu)
  • #{! facesContext.getMessageList(null).isEmpty()} -> rzuca IllegalAccessException: Klasa javax.el.BeanELResolver nie może uzyskać dostępu do członka klasy java.util.Collections $ UnmodifiableCollection z modyfikatorów "publiczne"
+0

Czy próbowałeś napisać to tak samo, jak w swojej funkcji? EL jest świadomy! operator. – Paranaix

+0

Dzięki! Po prostu próbowałem (patrz edytuj powyżej), ale to nie zadziałało – gonzalad

+0

@gonzalad, dunno, jeśli jest dobre dla ciebie, ale zaktualizowałem moją odpowiedź ... – Daniel

Odpowiedz

18

ma potrzeby niestandardowych funkcji EL

spróbować tej

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

EDIT

nie próbował go samodzielnie, ale spróbuj

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

pomysł ...

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

'FacesContext # getMessageList()' zwraca ** wszystkie ** wiadomości, także wiadomości inne niż globalne. – BalusC

+0

Próbowałem # {nie pustych facesContext.messageList (null)} ale generuje wyjątek (zobacz edycję powyżej, aby uzyskać więcej informacji) – gonzalad

+0

w przypadku, gdy chcesz wskazać sytuację, gdy masz wiadomości na liście msgs i nie ma błędu sprawdzania poprawności w tym samym czas, spójrz na moją zredagowaną odpowiedź ... – Daniel

1

Spróbuj tego:

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

zamiast:

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

w odpowiedzi Daniela.

Albo ten:

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

gdzie 'inputForm' jest:

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

jeśli chcesz zająć się tylko jednym z kilku formularzy na swojej stronie.

1

Wiem, że to stara nitka, ale po wysiłku szukania nieuchwytnego rozwiązania, znalazłem wyjaśnienie dla tego zachowania, i ponieważ nie mogę znaleźć tego wyjaśnienia nigdzie (nie wiem dlaczego), myślę, że to mogłoby być pomocne.

I się el funkcji nieco inaczej:

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

Różnica jest parametrem clientId. Zachowanie tej funkcji jest dokładnie takie samo jak użycie #{not empty facesContext.getMessageList(clientId)}. Debugując kod, zauważyłem, że po wywołaniu funkcji z clientId = null, wartość clientId w funkcji faktycznie jest "" (pusty ciąg).

Po tym, konsultowany EL 3.0 Spec, a znaleziono:

Sekcja 1.23 - Konwersja typu

Każde wyrażenie jest oceniane w kontekście oczekiwanego typu. Wynik oceny wyrażenia może nie być dokładnie zgodny z oczekiwanym typem, dlatego zastosowano zasady opisane w poniższych sekcjach. [...]

Sekcja 1.23.2 - zmuszania A do String

Jeżeli A jest zerowy: powrót "" [...]

Więc nie sądzę, że istnieje sposób żądania wiadomości z wartością clientId = null przekazującą wartość null jako parametr. Jedynym sposobem jest posiadanie funkcji, która robi to bez użycia parametru lub testowania, jeśli parametr został ustawiony na pusty ciąg.

+0

Przyjemny połów. Jest to znany błąd w Oracle EL impl i naprawiony w a.o. WildFly 8.2/GlassFish 4.1 i nowsze. Tomcat później ponownie wprowadził ten sam błąd w Apache EL, który nigdy nie został "naprawiony" i wymaga niestandardowego przelicznika EL. Powiązane: http://balusc.omnifaces.org/2015/10/the-empty-string-madness.html – BalusC

+0

@ BalusC Używam Glassfish 4.1 z Oracle EL impl (wer. 3.0.1-b03). Może nie jest uważany za błąd, ponieważ jest w specyfikacji, ale na pewno jest strasznie zobowiązany do zaimplementowania niestandardowych funkcji/rozpoznawania po prostu do zrobienia prostych rzeczy, takich jak to. – Luciano

+0

Naprawiono to w wersji 3.0.1-b05. Być może jest to w 4.1.1. – BalusC

Powiązane problemy