2011-09-21 17 views
6

Mam stronę JSF (przy użyciu MyFaces 2.0), która zbiera trochę danych przy pierwszym wyświetleniu. Jeśli nie może znaleźć pewnych informacji, powinien dostarczyć wiadomość o tym efekcie i przekierować z powrotem na inną stronę. Próbowałem użyć rozwiązania znalezionego tutaj Preserving FacesMessage after redirect for presentation through <h:message> in JSF (setKeepMessages (true)), ale wiadomości nie są wyświetlane po przekierowaniu. Jedyną różnicą, jaką mogę zauważyć, jest to, że nie używam reguły nawigacji, nazywam wywołanie przekierowania() w kontekście zewnętrznym, ponieważ nie występuje to w normalnym działaniu.Zachowywanie komunikatów JSF po przekierowaniu

odpowiedni kod:

public void redirectToPageWithMessage(String inPage, String message, FacesMessage.Severity severity){ 
    getFlash().setKeepMessages(true); 
    addMessage(message, severity); 
    try { 
     getFacesContext().getExternalContext().redirect(inPage); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Niestety to nie wydają się działać. Przekierowanie ma się dobrze, ale znaczniki /> < nie wyświetlają komunikatu. Czy jest coś innego w sposobie, w jaki następuje przekierowanie(), które uniemożliwiają działanie?

Odpowiedz

4

Kod, który zapisuje komunikaty, jest wykonywany po zakończeniu fazy (patrz Flash.doPostPhaseActions (FacesContext)). Oczekuje się, że to nie zadziała, ale może wywołasz Flash.doPostPhaseActions przed przekierowaniem. Uwaga nie jest "czystym" rozwiązaniem, ale jest to możliwe.

+0

Czy istnieje lepszy sposób (inny niż wywoływanie przekierowania()) do przekierowania wewnątrz funkcji, która nie zwróci wyniku? – moneyt

0

Wiadomości JSF są przechowywane tylko w celu przetworzenia faktycznego żądania. Drugi wniosek jest wysyłany przy użyciu przekierowania, więc wiadomości JSF zostaną utracone. EL-Flash jest sposobem na obejście tego. Ten przykład powinien zadziałać: http://ocpsoft.com/java/persist-and-pass-facesmessages-over-page-redirects/

+3

Czy brakowało Ci pierwszego akapitu o 'setKeepMessages (true)' i linii 'getFlash(). SetKeepMessages (true);' fragment kodu pytania? On ** już ** używa Flasha, ale nie działa poprawnie w połączeniu z 'ExternalContext # redirect()'. – BalusC

0

Miałem ten sam problem i rozwiązałem go, nie używając ExternalContext.redirect(), ale by grać z wynikiem twoich działań.

To znaczy, że moje działanie wywołane przez moje przyciski zwraca String (wynik), który wskazuje zasady nawigacji, aby przejść do następnej strony. W tym systemie wiadomości są zachowywane.

+1

Teraz przesyłasz dalej, zamiast przekierowywać. W tym celu nie potrzebujesz już 'Flash # setKeepMessages()'. A może w ogóle go nie używasz? – BalusC

+0

Masz rację, przestałem go używać :) W zasadzie odkryłem, że gdy natknąłem się na błąd [WELD-1218] (https://issues.jboss.org/browse/WELD-1218). –

Powiązane problemy