2013-08-28 12 views
6

Ich habe einen <f:viewParam> Tag auf JSF-Seiten, der nach Konvertierung und Validierung GET-Parameter für die entsprechende verwaltete Bean festlegt.Validierungs-/Konvertierungsfehler von <f:viewParam> werden nicht in <f: locale anzeigen> lokalisiert, sondern im Standardgebietsschema

Wenn entweder Wandlungs- bzw. Validierungsfehler auftreten, wird eine entsprechende Fehlermeldung abgerufen von einem Ressourcenbündel und angezeigt auf <p:messages> (auch <p:growl><h:messages> oder sein kann).

Die Anwendung ist mehrsprachig. Wenn eine andere Sprache ausgewählt wird, sollte daher eine Nachricht in dieser Sprache angezeigt werden. Die Nachricht wird jedoch immer gemäß der Standardländereinstellung en (für Englisch) angezeigt.

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> 

Der Konverter:

@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. 
    } 
} 

Außer den Nachrichten von <f:viewParam>, ist es kein Problem. Alle anderen Arten von Nachrichten werden in der Sprache angezeigt, die vom Benutzer ausgewählt wurde.

Gibt es etwas Besonderes mit <f:viewParam>?

Antwort

5

kann ich Ihr Problem reproduzieren. Sowohl Mojarra 2.1.25 als auch MyFaces 2.1.12 zeigen das gleiche Problem. Ich bin mir daher nicht sicher, ob dies ein Fehler im JSF-Impl oder ein Versehen in der JSF-Spezifikation ist. Bisher wurde festgestellt, dass das Gebietsschema "viewroot" nicht für eine GET-Anforderung festgelegt wurde, bevor die Renderantwortphase eingegeben wurde. Der Konverter wird während der Validierungsphase ausgeführt, weit vor der Renderantwort. Dies erklärt, warum stattdessen das Standardgebietsschema verwendet wurde. Ich muss es später untersuchen und bei Bedarf ein Problem an Mojarra melden.

In der Zwischenzeit die beste Wahl, dieses Problem zu lösen, ist das Bündel zu erhalten, wie folgt statt EL-Auswertung der <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); 
// ... 

aktualisieren: Ich habe berichtet issue 3021 als für dieses Problem. Ich kann immer noch nicht sagen, was die Spezifikation zu diesem Zeitpunkt sagt, aber ich finde das Verhalten der Implementierung nicht intuitiv.


Update 2: die Mojarra und MyFaces Jungs auf diese vereinbart. Für Mojarra war es fixed wie in 2.2.5 (kein 2.1.x Backport schon?) Und für MyFaces war es fixed nach 2.0.19, 2.1.13 und 2.2.0.

+0

Ich kann diese Methode 'evaluateExpressionGet (String expression)' nicht sehen. Ich kann nur sehen 'public T evaluateExpressionGet (FacesContext-Kontext, String Ausdruck, Klasse expectedType) löst stattdessen ELException'. Ist es da? – Tiny

+0

Entschuldigung, ich habe ein zu stark vereinfachtes Beispiel gepostet (eigentlich habe ich einen statischen Import von 'org.omnifaces.util.Faces' verwendet) und fälschlicherweise angenommen, dass Sie den Hinweis bezüglich des Jobs der Methode verstehen. Ich habe die Antwort aktualisiert. – BalusC

+0

Es scheint, wenn die View-Metadaten verarbeitet werden, das äußere Tag f: view wird nicht berücksichtigt, aber theoretisch sollte es nicht so sein, weil f: view etwas Besonderes ist. Sieht für mich wie ein Käfer aus. – lu4242