我的Java应用程序在启动时加载属性文件,其中包含键值对。我可以成功设置和检索预期的属性。
但是,就目前而言,属性文件可以包含我要放在那里的任何属性名称。我希望能够将属性限制为特定集合,其中一些是强制性的,另一些是可选的。
我可以针对有效集合手动检查每个已加载的属性,但我想知道是否有更优雅的方法来执行此操作。例如。也许某种方式来声明预期的强制/可选属性,以便在加载属性文件时,如果检测到无效或缺失属性,则抛出异常。类似于boost::program_options
在C ++中提供的东西。
答案 0 :(得分:3)
由于Properties
已经是一个简单的可迭代结构,我只会针对该对象执行验证。以下是必需与可选的简单验证。
public static void testProps(Properties props, Set<String> required, Set<String> optional) {
int requiredCount=0;
Enumeration keys = props.keys();
while (keys.hasMoreElements()) {
String key=(String) keys.nextElement();
if (required.contains(key)) {
requiredCount++;
} else if (!optional.contains(key)) {
throw new IllegalStateException("Unauthorized key : " + key);
}
}
if (requiredCount<required.size()) {
for (String requiredKey : required) {
if (!props.containsKey(requiredKey)) {
throw new IllegalStateException("Missing required key : " + requiredKey);
}
}
}
}
答案 1 :(得分:1)
我可以针对有效集合手动检查每个已加载的属性但是我 我想知道是否有更优雅的方式来做到这一点。例如。也许 某种方式来声明预期的强制/可选属性,所以 加载属性文件时,如果是,则抛出异常 检测到无效或缺失属性。
JDK的内置API(java.util.Properties)不提供此类验证。
然而,实现这一目标并不难实现你自己的ConfigLoader
类。您的类可以包装java.util.Properties
,并在加载后验证数据。例如,您可以维护一个强制键和可选键列表(硬编码或外部加载),然后根据这些列表检查加载键的列表。
你可能会找到一些实现这一点的实现,但是因为验证本身无论如何都将特定于你的需求,其余的相当简单,我认为不值得寻找现有的解决方案。