2013-08-28 4 views
6

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>?

Odpowiedz

5

Mogę odtworzyć twój problem. Zarówno Mojarra 2.1.25, jak i MyFaces 2.1.12 mają ten sam problem. Dlatego nie jestem pewien, czy jest to błąd w implikacji JSF, czy niedopatrzenie w specyfikacji JSF. Jak dotąd okazuje się, że ustawienia regionalne nie zostały ustawione dla żądania GET przed wprowadzeniem fazy odpowiedzi renderowania. Konwerter działa podczas fazy sprawdzania, daleko przed odpowiedzią na wyrażenie, co wyjaśnia, dlaczego zamiast tego otrzymał domyślne ustawienia regionalne. Muszę to później zbadać, aw razie potrzeby zgłosić problem Mojarrze.

W międzyczasie, najlepiej rozwiązać ten problem jest uzyskanie wiązki następująco zamiast EL-oceny <resource-bundle><var>:

String basename = "com.example.i18n.message"; // Exactly the same as <resource-bundle><base-name> 
Locale locale = context.getApplication().evaluateExpressionGet(context, "#{localeBean.locale}", Locale.class); 
ResourceBundle bundle = ResourceBundle.getBundle(basename, locale); 
// ... 

Aktualizacja: ja już zgłaszane issue 3021 jako za ten problem. Nadal nie potrafię objąć głowy tym, co mówi spec, ale uważam, że zachowanie implementacji jest nieintuicyjne.


Aktualizacja 2: faceci Mojarra i MyFaces zgodził się na to. Dla Mojarry, to było fixed jak na 2.2.5 (bez wcześniejszego wsparcia w wersji 2.1.x?), A dla MyFaces to było fixed według 2.0.19, 2.1.13 i 2.2.0.

+0

Nie widzę tej metody "evaluateExpressionGet (wyrażenie String)". Widzę tylko 'public T evaluExpressionGet (Kontekst FacesContext, wyrażenie String, Class expectedType) zamiast tego wyrzuca ELException'. Czy to tam? – Tiny

+0

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

+0

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

Powiązane problemy