【问题标题】:Java properties file validationJava 属性文件验证
【发布时间】:2017-11-16 07:06:46
【问题描述】:

我的 Java 应用程序在启动时加载一个包含键值对的属性文件。我可以成功设置和检索预期的属性。

但是,就目前而言,属性文件可以包含我想放在那里的任何属性名称。我希望能够将属性限制为特定的集合,其中一些是强制性的,而另一些则是可选的。

我可以根据有效集合手动检查每个加载的属性,但我想知道是否有更优雅的方法来执行此操作。例如。也许某种方式来声明预期的强制/可选属性,以便在加载属性文件时,如果检测到无效或丢失的属性,则会引发异常。类似于 boost::program_options 在 C++ 中提供的那种东西。

【问题讨论】:

  • 可以使用命令行解析工具,如JOptSimple
  • 文件中的属性是什么真的很重要吗?您应该只使用您需要的属性。如果里面还有其他的,除了可能的内存价格,这有关系吗?
  • @assylias 看起来JOptSimple 只解析命令行选项。
  • @RealSkeptic 也许不是,但我仍然想知道。
  • @ksl 命令行选项只是数组中的字符串。您可能可以将参数转换为字符串数组并将其传递给命令行解析工具。您必须为此编写一个小方法,但随后您将免费获得所有可选/必需/格式检查等。可能有直接解析属性文件的工具,但我不知道。

标签: java properties properties-file


【解决方案1】:

由于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);
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    我可以根据有效集合手动检查每个加载的属性,但我 想知道是否有更优雅的方法来做到这一点。例如。可能 某种方式来声明预期的强制/可选属性,所以 加载属性文件时,如果 检测到无效或缺失的属性。

    JDK 的内置 API (java.util.Properties) 不提供这种验证。

    但是,实现您自己的 ConfigLoader 类应该不难做到这一点。您的类可以包装java.util.Properties,并在加载后验证数据。例如,您可以维护一个强制和可选键的列表(硬编码或从外部加载),然后对照这些列表检查加载的键列表。

    您可能会找到一些执行此操作的实现,但由于验证本身将特定于您的需求,其余部分相当简单,我认为不值得寻找现有的解决方案。

    【讨论】:

      猜你喜欢
      • 2010-12-16
      • 2012-03-17
      • 2016-06-04
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多