Интернализация проекта JSF в WebSphere 7 - PullRequest
0 голосов
/ 16 ноября 2011

Я пытаюсь реализовать загрузку Resource Bundles для приложения JSF из БД по примеру: интернационализация в JSF с записями ResourceBundle, которые загружаются из базы данных

Для теста, который я кодировалgetItSomehow () так же, как создать HashMap и заполнить его ключом "hello_world" и значением "[" + locale + "]" + "hello world"

Пример отлично работает, когда я его разверну на Glassfish3.Но когда я использую WebSphere AS 7, страница jsf отображается правильно только в первый раз.Открывая страницу jsf в других браузерах (с другим выбранным языком), я всегда получаю ответ в локали первого запуска.

Во время отладки я обнаружил разницу в реализации ResourceBundle.java: Glassfish использует этот класс, предоставленный в rt.jar из JDK1.6;но WebSphere имеет этот класс внутри java.util.jar

ResourceBundle (из WebSphere), вызываемый из ApplicationResourceBundle.getResourceBundle (), вызывает handleGetBundle () и, наконец, вызывает my.i18n.DbResourceBundle $ DBControl.newBundle ().Вызванный второй (и далее) раз с другой локалью, он не вызывает моего переопределения, а просто возвращает тот же пакет, созданный для первой локали.

Вопрос: можно ли кодировать интернализуемое веб-приложение jsf, развернутое в WebSphere AS 7.0.07, не копаясь и не взламывая внутренние компоненты AS?

(среда: Windows XP, WebSphere AS 7.0.0.7, jdk1.6.0_24, jsf 2.1.4)

1 Ответ

0 голосов
/ 03 апреля 2012

Вы можете предоставить конкретную реализацию ResourceBundle.

Вот пример, который получает текущую локаль каждый раз, когда JSF вызывает методы ResourceBundle:

package my.company.jsf.util;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;

import javax.faces.context.FacesContext;

public class MyBundle extends ResourceBundle {

    private static final Map<Locale, ResourceBundle> RB_CACHE = new HashMap<Locale, ResourceBundle>();
    private static final String BUNDLE_NAME = "my-messages";

    public MyBundle() {
    }

    @Override
    public Enumeration<String> getKeys() {
        ResourceBundle rb = getResourceBundle();
        final Iterator<String> it = rb.keySet().iterator();
        return new Enumeration<String>() {

            @Override
            public boolean hasMoreElements() {
                return it.hasNext();
            }

            @Override
            public String nextElement() {
                return it.next();
            }

        };
    }


    @Override
    protected Object handleGetObject(String key) {
        ResourceBundle rb = getResourceBundle();
        return rb.getObject(key);
    }

    private ResourceBundle getResourceBundle() {
        Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
        ResourceBundle rb = RB_CACHE.get(locale);
        if (rb == null) {
            rb = ResourceBundle.getBundle(BUNDLE_NAME, locale);
            RB_CACHE.put(locale, rb);
        }
        return rb;
    }
}

и в вашем лице-config.xml положите:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">
    <application>
        <resource-bundle>
            <base-name>my.company.jsf.util.MyBundle</base-name>
            <var>MSG</var>
        </resource-bundle>
    </application>
</faces-config>

У нас была та же проблема, и это решение работало для нас с Windows Server 2008, WebSphere AS 7.0.0.19, jdk1.6.0_29, jsf 2.1.5

...