Как я могу получить строку пакета сообщений из управляемого компонента? - PullRequest
29 голосов
/ 08 июня 2011

Я хотел бы иметь возможность получить строку из пакета сообщений из управляемого компонента JSF 2. Это может быть сделано в ситуациях, когда строка используется в качестве сводного или подробного параметра в FacesMessage или в качестве сообщения в брошенном исключении.

Я хочу убедиться, что управляемый компонент загружает правильный пакет сообщений для локали пользователя. Мне не понятно, как это сделать из управляемого компонента с помощью вызовов API JSF.

Моя конфигурация:

  • Использование Tomcat 7 в качестве контейнера, поэтому решение не может зависеть от вызовов API, которые работают только в полном контейнере сервера приложений
  • Использование эталонной реализации JSF 2 (Mojarra)
  • НЕ использовать библиотеки, поддерживающие CDI

ПРИМЕЧАНИЕ: Я видел этот похожий вопрос , но это зависит от функций, которые недоступны в моей конфигурации

РЕДАКТИРОВАТЬ: Я допустил ошибку в своем первоначальном вопросе. Я хотел спросить: «Как получить строку пакета resource из управляемого компонента?» BalusC дал мне правильный ответ на то, что я спросил. Решение, о котором я действительно хотел спросить, очень похоже:

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);
}

Также здесь есть ссылка на другой вопрос , объясняющий разницу между пакетами "сообщения" и пакетами "ресурса".

Ответы [ 3 ]

49 голосов
/ 08 июня 2011

Вы можете получить полное имя комплекта <message-bundle> по Application#getMessageBundle(). Вы можете получить текущую локаль по UIViewRoot#getLocale(). Вы можете получить ResourceBundle из полной комплектации название и локаль по ResourceBundle#getBundle().

Итак, подведем итог:

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

Обновление : в соответствии с ошибкой в ​​вопросе вы действительно хотите получить пакет, идентифицируемый <base-name> из <resource-bundle>. К сожалению, это не доступно напрямую стандартным API JSF. Вы должны либо жестко закодировать одно и то же базовое имя в коде и заменить его на messageBundleName в приведенном выше примере, либо добавить его в качестве управляемого свойства на <var> в bean-объекте с областью запроса:

@ManagedProperty("#{msg}")
private ResourceBundle bundle; // +setter
24 голосов
/ 02 августа 2011
FacesContext context = FacesContext.getCurrentInstance();
ResourceBundle bundle = context.getApplication().getResourceBundle(context, "msg");
String message = bundle.getString("key");

здесь ключ - это имя свойства, к которому вы хотите получить доступ из файла свойств.

       message = This is "message"

Эта запись из файла messages.properites.и «сообщение» - это «ключ».

5 голосов
/ 10 февраля 2015

Существует два способа получить пакет ресурсов String в управляемом компоненте, используя baseName или varName (см. Определение каждого из них ниже):

Используя varName:

varName: это строка, представляющая <var></var> в <resource-bundle>

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

Использование baseName:

baseName: полное имя пакета ресурсов (<base-name> в <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");
...