如何从ResourceBundle切换到Properties(类)?
我有一个应用程序分为2个Java项目(核心和Web)。核心模块中的Java服务必须从位于Web模块中的.properties文件中读取值。 当我使用ResourceBundle时,它按预期工作。
我想切换到Properties类有几个原因(特别是因为ResourceBundle被缓存了,我不想实现ResourceBundle.Control没有缓存)。 不幸的是我无法让它工作,特别是因为我无法找出使用哪种正确的相对路径。
我阅读了反编译的ResourceBundle类(等)并注意到在某些ClassLoader上使用了getResource()。 因此,我没有直接使用FileInputStream,而是在ServiceImpl.class或ResourceBundle.class上使用getResource()或简单的getResourceAsStream()进行测试,但仍未成功...
任何人都知道如何让这项工作?谢谢!
这是我的应用核心,服务获取属性值:
app-core
src/main/java
com.my.company.impl.ServiceImpl
public void someRun() {
String myProperty = null;
myProperty = getPropertyRB("foo.bar.key"); // I get what I want
myProperty = getPropertyP("foo.bar.key"); // not here...
}
private String getPropertyRB(String key) {
ResourceBundle bundle = ResourceBundle.getBundle("properties/app-info");
String property = null;
try {
property = bundle.getString(key);
} catch (MissingResourceException mre) {
// ...
}
return property;
}
private String getPropertyP(String key) {
Properties properties = new Properties();
InputStream inputStream = new FileInputStream("properties/app-info.properties"); // Seems like the path isn't the good one
properties.load(inputStream);
// ... didn't include all the try/catch stuff
return properties.getProperty(key);
}
这是驻留属性文件的Web模块:
app-web
src/main/resources
/properties
app-info.properties
答案 0 :(得分:3)
您应该使用getResource()
或getResourceAsStream()
使用正确的路径和类加载器。
InputStream inputStream = getClass()。getClassLoader()。getResourceAsStream(“properties / app-info.properties”);
确保文件的名称为app-info.properties
,而不是app-info_en.properties
ResourceBundle
可以找到getResourceAsStream()
(当上下文匹配时)而不是{{1}}。< / p>
答案 1 :(得分:3)
您不应该尝试从文件系统中读取属性。更改获取属性的方法,以便从资源流中加载它们。伪代码:
private String getPropertyP(final String key) {
final Properties properties = new Properties();
final InputStream inputStream = Thread.currentThread().getContextClassLoader()
.getResourceAsStream("properties/app-info.properties");
properties.load(inputStream);
return properties.getProperty(key);
}