【问题标题】:Can I use both arrays and non-arrays with Apache Commons Config?我可以在 Apache Commons Config 中同时使用数组和非数组吗?
【发布时间】:2012-08-12 00:17:30
【问题描述】:

使用以下属性文件:

foo=hello, world!
bar=first,second

我想以字符串形式检索第一项,以数组形式检索第二项。我原以为 getStringgetStringArray 会处理这个问题,但它不会 - getString("foo") 只是在逗号之前获取所有内容,即“你好”。

如果我使用 setDelimiterParsingDisabled 禁用分隔符解析,foo 很好,但这也会改变 getStringArray("bar") 的行为以返回单元素数组!

我找不到如何明确告诉它我希望它如何解释单个配置项,无论是作为字符串还是作为数组。我不想将配置项放入具有不同分隔符规则的单独配置文件中,我更喜欢使用逗号作为 getStringArray 案例的分隔符。

详细地说,这个 sn-p 打印 hello - 2hello, world! - 1 - 我希望它打印 hello, world! - 2

AbstractFileConfiguration config = new PropertiesConfiguration();
config.setFileName("C:\\temp\\temp.properties");
//config.setDelimiterParsingDisabled(true);
config.load();
System.out.println(config.getString("foo") + " - " + config.getStringArray("bar").length);

【问题讨论】:

标签: java configuration apache-commons-config


【解决方案1】:

正如您所发现的,Commons Config 缺少类似 getPlainString() 的方法。以下是一些解决方法的建议。

我认为使用不同的列表分隔符是最容易实现的。如果您需要更复杂的东西,请考虑其他两个:

通过 setListDelimiter() 使用不同的列表分隔符

只要您不需要将相同的值解释为字符串和数组即可。

属性文件:

foo=hello, world!
bar=first;second

代码:

AbstractFileConfiguration config = new PropertiesConfiguration();
config.setFileName("C:\\temp\\temp.properties");
config.setListDelimiter(';');
config.load();
System.out.println(config.getString("foo") + " - " + config.getStringArray("bar").length);

禁用分隔符解析并自行拆分

使用String.split() 轻松完成。一个简单的静态方法就可以了:

public static String[] gerStringArray(Configuration config, String key)

或者创建PropertiesConfiguration 的子类并覆盖getStringArray()getList() 方法。

使用两种不同的配置

一个用于设置数据,您知道数据将采用什么格式。在这里您可以激活分隔符解析。

还有一个用于您可能有任意数据的文本数据。在这里您应该停用分隔符解析。

这具有分离设置和文本数据的额外优势。

  • 不混合设置和文本数据可以使两种配置更清晰。特别是如果两者都有很多。
  • 通常设置数据会根据部署环境(实时/测试)而变化,而文本数据会根据区域设置(en_GB/de_DE)而变化。

【讨论】:

  • 这就是我最终要做的,但这是一个非常令人失望的解决方案。如果foo 是一个任意句子,我无法预测其中会出现哪些标点符号或字符(例如国际化消息)怎么办?
  • @bacar 好点。在处理未知标点符号时,请注意 common-configuration 的 special characters and escaping。还有${variableInterpolation}
【解决方案2】:

在属性文件中你可以这样做:

urls=localhost
urls=127.0.0.1

在 Java 中你可以得到这个列表:

String[] urls = Configure.settings().getStringArray("urls");
for(String url : urls)
    System.out.println(url);

【讨论】:

    猜你喜欢
    • 2012-03-11
    • 1970-01-01
    • 2019-05-14
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多