Настройка связки сообщений с сообщениями в кодировке 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 все работает без проблем. Итак, файл свойств по умолчанию используется, а файл по умолчанию - нет.

Кто-нибудь знает, в чем проблема с конфигурацией пакета сообщений?

0 ответов

Другие вопросы по тегам