Настройка связки сообщений с сообщениями в кодировке UTF-8
То, чего я пытаюсь добиться, - это проверка JSF и конвертер сообщений в кодировке UTF-8 (пакет сообщений). Кроме того, я хотел бы получить пользовательский пакет ресурсов для меток и т. Д. (Resource-bundle).
Мне удалось создать и использовать пользовательский пакет ресурсов успешно, но у меня возникла проблема с определением пакета сообщений.
У меня есть следующая структура в каталоге src /:
- com.example.i18n.resources
- FacesMsgs.properties
- FacesMsgs_de.properties
- UTF8FacesMsgs.java
- Msgs.properties
- Msgs_de.properties
- UTF8Msgs.java
Фрагмент Faces-config.xml:
<application>
<message-bundle>com.example.i18n.resources.UTF8FacesMsgs</message-bundle>
<resource-bundle>
<base-name>com.example.i18n.resources.UTF8Msgs</base-name>
<var>msg</var>
</resource-bundle>
<locale-config>
<default-locale>de</default-locale>
</locale-config>
</application>
В своей реализации я следовал приведенным здесь инструкциям: Интернационализация в JSF с файлами свойств в кодировке UTF-8
Это итоговые классы:
public class ResourceBundleWrapper extends ResourceBundle {
public ResourceBundleWrapper(ResourceBundle parent) {
setParent(parent);
}
@Override
protected Object handleGetObject(String key) {
return parent.getObject(key);
}
@Override
public Enumeration<String> getKeys() {
return parent.getKeys();
}
}
EncodingControl.java
public class EncodingControl extends Control {
private String encoding;
private String extension;
public EncodingControl(String encoding, String extension) {
this.encoding = encoding;
this.extension = extension;
}
@Override
public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException {
String bundleName = toBundleName(baseName, locale);
String resourceName = toResourceName(bundleName, extension);
ResourceBundle bundle = null;
InputStream stream = null;
if (reload) {
URL url = loader.getResource(resourceName);
if (url != null) {
URLConnection connection = url.openConnection();
if (connection != null) {
connection.setUseCaches(false);
stream = connection.getInputStream();
}
}
} else {
stream = loader.getResourceAsStream(resourceName);
}
if (stream != null) {
try {
bundle = new PropertyResourceBundle(new InputStreamReader(stream, encoding));
} finally {
stream.close();
}
}
return bundle;
}
}
UTF8FacesMsgs.java
public class UTF8FacesMsgs extends ResourceBundleWrapper {
public UTF8FacesMsgs() {
super(ResourceBundle.getBundle("com.example.i18n.resources.FacesMsgs",
FacesContext.getCurrentInstance().getViewRoot().getLocale(),
new EncodingControl("UTF-8", "properties"));
}
}
UTF8Msgs.java
public class UTF8Msgs extends ResourceBundleWrapper {
public UTF8Msgs() {
super(ResourceBundle.getBundle("com.example.i18n.resources.Msgs",
FacesContext.getCurrentInstance().getViewRoot().getLocale(),
new EncodingControl("UTF-8", "properties"));
}
}
Результирующее поведение:
Конфигурация пакета ресурсов, кажется, работает без проблем: по умолчанию используется UTF8Msgs.java, и все метки на странице отображаются успешно. С другой стороны, поведение с комплектом сообщений совершенно иное, хотя все настроено аналогичным образом: когда проверка завершается неудачно (отправка кнопки запускает проверку), я получаю MissingResourceException - UTF8FacesMsgs.java по умолчанию не используется и ожидается UTF8FacesMsgs_de.java.
Поведение с внесенными изменениями:
Когда я настраиваю face-config.xml следующим образом (напрямую используя файл свойств, а не класс java):
<application>
<message-bundle>com.example.i18n.resources.FacesMsgs</message-bundle>
<resource-bundle>
<base-name>com.example.i18n.resources.UTF8Msgs</base-name>
<var>msg</var>
</resource-bundle>
<locale-config>
<default-locale>de</default-locale>
</locale-config>
</application>
и удалить FacesMsgs_de.properties все работает без проблем. Итак, файл свойств по умолчанию используется, а файл по умолчанию - нет.
Кто-нибудь знает, в чем проблема с конфигурацией пакета сообщений?