Mam znacznik <f:viewParam>
na stronach JSF, który ustawia parametry GET do odpowiedniego zarządzanego komponentu bean po konwersji i sprawdzeniu poprawności.Błędy sprawdzania poprawności/konwersji <f:viewParam> nie są lokalizowane do <f: view locale>, ale domyślne ustawienia narodowe
Jeśli wystąpi błąd konwersji lub sprawdzania poprawności, zostanie pobrany odpowiedni komunikat o błędzie z paczki zasobów i wyświetlony na <p:messages>
(może być również <p:growl>
lub <h:messages>
).
Aplikacja jest wielojęzyczna. Dlatego też, gdy wybrany jest inny język, komunikat powinien być wyświetlany w tym języku, ale zawsze wyświetla komunikat zgodnie z domyślnym ustawieniem narodowym en
(dla języka angielskiego).
Test.xhtml:
<!DOCTYPE html>
<html lang="#{localeBean.language}"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<f:view locale="#{localeBean.locale}">
<f:metadata>
<f:viewParam name="id" converter="#{myConverter}" />
</f:metadata>
<h:head>
<title>Test</title>
</h:head>
<h:body>
<h:messages />
</h:body>
</f:view>
</html>
Przetwornik:
@FacesConverter("myConverter")
public final class MyConverter implements Converter
{
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value)
{
ResourceBundle bundle = context.getApplication()
.evaluateExpressionGet(context, "#{messages}", ResourceBundle.class);
String message = bundle.getString("id.conversion.error");
throw new ConverterException(
new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null));
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value)
{
throw new UnsupportedOperationException(); // Not relevant in this problem.
}
}
wyjątkiem wiadomości od <f:viewParam>
, nie ma problemu. Wszystkie inne rodzaje wiadomości wyświetlane są w języku wybranym przez użytkownika.
Czy jest coś specjalnego z <f:viewParam>
?
Nie widzę tej metody "evaluateExpressionGet (wyrażenie String)". Widzę tylko 'public T evaluExpressionGet (Kontekst FacesContext, wyrażenie String, Class extends T> expectedType) zamiast tego wyrzuca ELException'. Czy to tam? –
Tiny
Przepraszam, napisałem przykład uproszczony (w rzeczywistości używałem statycznego importu z 'org.omnifaces.util.Faces') i błędnie zakładałem, że zrozumiesz podpowiedź co do metody pracy. Zaktualizowałem odpowiedź. – BalusC
Wygląda na to, że metadane widoku są przetwarzane, zewnętrzny znacznik f: view nie jest brany pod uwagę, ale teoretycznie nie powinno tak być, ponieważ f: view jest czymś wyjątkowym. Wygląda mi na błąd. – lu4242