Java:如何在运行时将数据库中的属性添加到R​​esourceBundle?

问题描述:

背景Java:如何在运行时将数据库中的属性添加到R​​esourceBundle?

我正在开发一个使用Maven的Java Web应用程序。我已经创建了此路径和格式的ResourceBundles:src/main/resources/i18n/LanguageBundle_xx_XX.properties

一切工作完美,我有一切工作在前端(使用JSTL)。

问题

用户可以创建键/值对,从前端,即随后被存储在格式MySQL数据库:KEY | VALUE

我有一个初始化servlet,在将用户带到第一个jsp页面之前完成所有设置。

在初始化servlet中,我从数据库中获取所有KEY/VALUE对,但现在我想将它们添加到LanguageBundle中,以便翻译在第一个jsp页面出现时准备好。

到目前为止,我已经试过:

  1. 返回所有的键/值对从DB
  2. 迭代返回的值
  3. 如果项不LanguageBundle_xx_XX
  4. 存在添加KEY/VALUE property.put(“KEY”,“VALUE”)

现在,它确实添加了该属性,但是如果我尝试访问该范围之外的特定属性(例如,其他servlet,jsp),则会失败,因为它不存在于特定的.properties文件中。

我该如何解决这个问题?

+0

到目前为止创建的内容不是ResourceBundle,而是属性文件。您需要查看创建ResourceBundle的各种方法,这是一个* object *。 – EJP

+0

我觉得@EJP理念有一些优点。我也一样。问题不在于属性文件,问题在于创建资源包,使其不仅从文件中读取数据,还从数据库中读取数据。也许看看http://stackoverflow.com/questions/2451049/do-resource-bundles-in-java-support-runtime-string-substitution? –

UPDATE:

我想出了一个可行的解决方案。

Properties prop = new Properties(); 
    InputStream in = getClass().getResourceAsStream("/i18n/LanguageBundle_en_US.properties"); 
    prop.load(in); 
prop.setProperty("KEY", "VALUE"); 
in.close(); 
prop.store(new FileOutputStream(getClass().getClassLoader().getResource("/i18n/LanguageBundle_en_US.properties").getFile()), null); 

有人可以告诉我,如果这是不好的做法或是否可以使用?

谢谢。

+0

资源不是文件,可以是只读的。 – EJP

+0

您正在覆盖下次可能会损坏的现有文件。我认为你应该尝试找到一种方法来修改内存中的值。 – pmcevoy12

+0

谢谢你回到我身边。我确实覆盖了实际。属性文件,但是,它只发生在目标文件夹中。这些KEY | VALUE对是我将要添加的最后和唯一的属性。我可以看到你的关心。我会暂时让它工作,并在稍后阶段回复它。如果我想出更好的解决方案,我会更新我的答案。祝你今天愉快。 – RasmusF