Как я могу получить строку пакета сообщений из управляемого 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);
}
Кроме того, вот ссылка на еще один вопрос, который объясняет разницу между пакетами сообщений и пакетами ресурсов.
Ответы
Ответ 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");