使用Apache Commons Configuration在属性文件中使用值列表进行变量插值,即$ {variable}

rod*_*cia 5 java properties apache-commons-config

我正在使用Apache Commons Configuration来读取属性文件,我完全能够进行变量插值,并且还可以将多值属性作为列表进行检索.但是,我无法正确加载具有多个值的属性,其中一个属性是另一个多值属性的引用(变量插值).

这是我的属性文件的示例(我也尝试使用逗号分隔语法):

doc.mime=application/msword
doc.mime=application/vnd.openxmlformats-officedocument.wordprocessingml.document
doc.mime=${office.mime}

office.mime=application/x-tika-msoffice
office.mime=application/x-tika-ooxml
Run Code Online (Sandbox Code Playgroud)

以及我如何阅读它:

Configuration config = new PropertiesConfiguration("myFile");
final String[] mimesArray = config.getStringArray("doc.mime");
for(String mime : mimesArray) System.out.println(mime);
final List<Object> mimesList = config.getList("doc.mime");
System.out.println(mimesList);
Run Code Online (Sandbox Code Playgroud)

这是我用任何一种方法得到的内容(getStringArraygetList):

[application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/x-tika-msoffice]

这跟我想象中的不同:两者的全部内容doc.mimeoffice.mime

有谁知道是否有可能在我的其他列表中插入整个值列表?如果是这样,它是如何完成的?

Are*_*rff 5

Commons 配置的作用

正如您所发现的:在插入多值属性时,Commons Configuration 只会解析该属性的第一个值。请参阅AbstractConfiguration#resolveContainerStore() 第 1177 行的代码。

我发现了一些相关的问题:

CONFIGURATION-28:有人想要(并得到)与您想要的完全相反的东西:只有多值属性中的第一个值。

CONFIGURATION-55:更多关于多值属性插值的讨论:

这个问题可能没有正确的解决方案,因为预期结果在很大程度上取决于具体用例

解决方法:在代码中合并两个列表

绝对比自定义插值更容易:

List<Object> mimesList = config.getList("doc.mime");
List<Object> officeList = config.getList("office.mime");
mimesList.addAll(officeList);
System.out.println(mimesList);
Run Code Online (Sandbox Code Playgroud)

使用 Commons Configuration 项目提出这个问题

改变整个可变插值系统可能很困难。但他们至少可以澄清文档。