【发布时间】:2014-07-22 21:49:45
【问题描述】:
在我的 XPages 应用程序中,我使用托管 Java bean (scope = application) 来翻译字符串:
public class Translator extends HashMap<String,String> implements Serializable {
private static final long serialVersionUID = 1L;
public String language = "en";
public Translator() { super(); this.init(null); }
public Translator(String language) { super(); this.init(language); }
public boolean init(String language) {
try {
FacesContext context = FacesContext.getCurrentInstance();
if (language!=null) this.language=language;
Properties data = new Properties();
// load translation strings from properties file in WEB-INF
data.load(new InputStreamReader(context.getExternalContext().getResourceAsStream("WEB-INF/translations_"+this.language+".properties"),"UTF-8"));
super.putAll(new HashMap<String,String>((Map) data));
// serializing the bean to a file on disk > this part of the code is just here to easily test how often the bean is initialized
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("C:\\dump\\Translator_"+this.language+"_"+new Date().getTime()+".ser"));
out.writeObject(this);
out.close();
return true;
}
catch (Exception e) { return false; }
}
public String getLanguage() { return this.language; }
public boolean setLanguage(String language) { return this.init(language); }
// special get function which is more tolerant than HashMap.get
public String get(Object key) {
String s = (String) key;
if (super.containsKey(s)) return super.get(s);
if (super.containsKey(s.toLowerCase())) return super.get(s.toLowerCase());
String s1 = s.substring(0,1);
if (s1.toLowerCase().equals(s1)) {
s1=super.get(s1.toUpperCase()+s.substring(1));
if (s1!=null) return s1.substring(0,1).toLowerCase()+s1.substring(1);
} else {
s1=super.get(s1.toLowerCase()+s.substring(1));
if (s1!=null) return s1.substring(0,1).toUpperCase()+s1.substring(1);
}
return s;
}
}
我使用“extends HashMap”,因为这样我只需编写“${myTranslatorBean['someText']}”(表达式语言)就可以将翻译输入我的 XPage。问题是 bean 在 EVERY 完全刷新或页面重新加载时重新初始化。我通过在每次初始化结束时将 bean 序列化为磁盘上的唯一文件来测试这一点。在我的其他托管 Java bean(不使用“扩展 HashMap”)中,不会发生此问题。谁能告诉我我的代码有什么问题?提前致谢。
编辑:faces-config.xml 中托管 Java bean 的条目如下所示:
<managed-bean>
<managed-bean-name>myTranslatorBean</managed-bean-name>
<managed-bean-class>com.ic.Translator</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
【问题讨论】:
-
如何用“语言”参数实例化 bean?
-
@FrantisekKossuth:这里提供的代码已经缩小,以包含尽可能少的错误源。在完整的类中,当调用空构造函数时(对于托管 bean 的情况),语言是根据上下文中的当前语言环境确定的。当我需要在代码中的某个地方使用自定义翻译器时,我会使用带有语言作为参数的构造函数。如果要将变量传递给托管 bean,则必须在 faces-config.xml 中声明一个“托管属性”。
-
我的问题完全是关于你发现了什么(并在接受的答案下方评论) - 你必须在某个地方调用 init() ...
标签: xpages