我正在尝试为数据库中的JSF应用程序加载资源包,请参阅示例:internationalization in JSF with ResourceBundle entries which are loaded from database
对于测试,我编写了getItSomehow(),就像创建HashMap一样,用关键字“hello_world”和值“[”+ locale +“]”+“hello world”填充它
当我在Glassfish3上部署它时,该示例工作正常。 但是当我使用WebSphere AS 7时,jsf页面只是第一次正确显示。在其他浏览器中打开jsf页面(选择了其他首选语言)我总是在首次运行的区域设置中收到响应。
在调试时,我发现ResourceBundle.java的实现有所不同:Glassfish使用JDK1.6的rt.jar中提供的这个类;但是WebSphere在java.util.jar中有这个类
从ApplicationResourceBundle.getResourceBundle()调用的ResourceBundle(WebSphere)调用handleGetBundle(),最后调用my.i18n.DbResourceBundle $ DBControl.newBundle()。 使用不同的语言环境调用第二(和更多)时间它不会调用我的覆盖,而只返回为第一个语言环境创建的相同包。
问题:是否可以对部署在WebSphere AS 7.0.07上的内部化jsf Web应用程序进行编码,而不是挖掘或侵入AS的内部?
(环境:Windows XP,WebSphere AS 7.0.0.7,jdk1.6.0_24,jsf 2.1.4)
答案 0 :(得分:0)
您可以提供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;
}
}
并在你的faces-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