Подтвердить что ты не робот

Как я могу получить строку пакета сообщений из управляемого bean?

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

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

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

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

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

РЕДАКТИРОВАТЬ: Я ошибся в своем первоначальном вопросе. Я хотел спросить: "Как я могу получить строку ресурса изнутри управляемого bean"? 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);
}

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

4b9b3361

Ответ 1

Вы можете получить полное квалифицированное имя пакета <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

Ответ 2

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

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

       message = This is "message"

Эта запись взята из файла messages.properites. и "сообщение" является "ключом".

Ответ 3

Есть два способа получить пакет ресурсов String в управляемом bean, используя 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");