wake-up-neo.com

Wie kann ich eine Message Bundle-Zeichenfolge aus einer verwalteten Bean abrufen?

Ich möchte in der Lage sein, eine Zeichenfolge aus einem Nachrichtenpaket in einer JSF 2-verwalteten Bean abzurufen. Dies würde in Situationen geschehen, in denen die Zeichenfolge als Zusammenfassungs- oder Detailparameter in einem FacesMessage oder als Nachricht in einer ausgelösten Ausnahme verwendet wird.

Ich möchte sicherstellen, dass die verwaltete Bean das richtige Nachrichtenpaket für das Gebietsschema des Benutzers lädt. Mir ist nicht klar, wie dies von einer verwalteten Bean aus mithilfe von JSF-API-Aufrufen erfolgen soll.

Meine Konfiguration ist:

  • Wenn Sie Tomcat 7 als Container verwenden, kann die Lösung nicht von API-Aufrufen abhängen, die nur in einem vollständigen Anwendungsserver-Container funktionieren
  • Verwenden der JSF 2-Referenzimplementierung (Mojarra)
  • Verwenden Sie KEINE Bibliotheken, die CDI zulassen

HINWEIS: Ich habe diese ähnliche Frage gesehen, dies hängt jedoch von Funktionen ab, die in meiner Konfiguration nicht verfügbar sind

EDIT: Ich habe in meiner ursprünglichen Frage einen Fehler gemacht. Ich wollte fragen: "Wie kann ich eine Ressourcen- Bundle-Zeichenfolge aus einer verwalteten Bean heraus abrufen?" BalusC gab mir die richtige Antwort auf meine Frage. Die Lösung für das, was ich eigentlich fragen wollte, ist sehr ähnlich:

public static String getResourceBundleString(
            String resourceBundleName,
            String resourceBundleKey)
        throws MissingResourceException {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ResourceBundle bundle = 
        facesContext.getApplication().getResourceBundle(
            facesContext, resourceBundleName);
    return bundle.getString(resourceBundleKey);
}

Hier ist auch ein Link zu eine andere Frage , der den Unterschied zwischen "Nachrichten" -Bündeln und "Ressourcen" -Bündeln erklärt.

30
Jim Tough

Sie können den vollständigen qualifizierten Bündelnamen von <message-bundle> Mit Application#getMessageBundle() ermitteln. Sie können das aktuelle Gebietsschema mit UIViewRoot#getLocale() abrufen. Sie können einen ResourceBundle aus einem vollständig qualifizierten Bündelnamen und der Ländereinstellung durch ResourceBundle#getBundle() abrufen.

Also zusammengefasst:

FacesContext facesContext = FacesContext.getCurrentInstance();
String messageBundleName = facesContext.getApplication().getMessageBundle();
Locale locale = facesContext.getViewRoot().getLocale();
ResourceBundle bundle = ResourceBundle.getBundle(messageBundleName, locale);
// ...

Update : Gemäß dem Fehler in der Frage möchten Sie tatsächlich das Bundle erhalten, das durch den <base-name> Von <resource-bundle>. Dies ist leider nicht direkt von einer Standard-JSF-API verfügbar. Sie müssen entweder denselben Basisnamen im Code fest codieren und das messageBundleName im obigen Beispiel damit ersetzen oder es als verwaltete Eigenschaft für <var> In eine Bean mit Anforderungsbereich einfügen:

@ManagedProperty("#{msg}")
private ResourceBundle bundle; // +setter
50
BalusC
FacesContext context = FacesContext.getCurrentInstance();
ResourceBundle bundle = context.getApplication().getResourceBundle(context, "msg");
String message = bundle.getString("key");

hier ist der Schlüssel der Name der Eigenschaft, auf die Sie über die Eigenschaftendatei zugreifen möchten.

       message = This is "message"

Dieser Eintrag stammt aus der Datei messages.properites. und "message" ist "key".

24
keiler

Es gibt zwei Möglichkeiten, mit baseName oder varName ein String-Ressourcenpaket in einer verwalteten Bean abzurufen (siehe Definition der einzelnen unten):

Verwenden von varName:

varName: ist der String, der das <var></var> im <resource-bundle>

FacesContext context = FacesContext.getCurrentInstance();
Application app = context.getApplication();
ResourceBundle bundle = app.getResourceBundle(context, varName);
String msg = bundle.getString("key");

Verwenden von baseName:

baseName: Der vollständig qualifizierte Name des Ressourcenpakets (<base-name> im <resource-bundle>).

FacesContext context = FacesContext.getCurrentInstance();
Locale locale = context .getViewRoot().getLocale();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
ResourceBundle bundle = ResourceBundle.getBundle(baseName, locale, loader);
String msg = bundle.getString("key");
5
Tarik