如何在Apache Commons Configuration中获取指定company.server值的所有配置?
嘿,刚接触Apache Commons Configuration确实容易在结构化配置筛选上踩坑,我来帮你搞定获取server01相关配置的问题~
获取Apache Commons Configuration中特定服务器的配置
首先,我先假设你的XML配置结构大概是这样的(毕竟你提到了精简示例,应该是类似多server节点带id的结构):
<company> <server> <id>server01</id> <app> <client>clientA</client> <port>8080</port> </app> <app> <client>clientB</client> <port>8081</port> </app> </server> <server> <id>server02</id> <app> <client>clientC</client> <port>8082</port> </app> </server> </company>
你之前用Properties configs = mCombinedConfig.getProperties("company.server");行不通的原因是:getProperties()会把所有server节点的配置扁平化到一个Properties对象里,不同服务器的配置会互相覆盖,根本没法区分出server01的内容。
要精准筛选server01的配置,我们可以利用Apache Commons Configuration对XPath的支持,或者结构化的子集查询,下面是具体方案:
方法1:用XPath筛选特定server节点
如果你的配置是XML格式,且用的是XMLConfiguration(CombinedConfiguration里的XML源也适用),可以启用XPath表达式引擎来精准定位:
步骤1:初始化配置并启用XPath
// 如果你是直接用XMLConfiguration XMLConfiguration xmlConfig = new XMLConfiguration("your-config.xml"); // 显式启用XPath表达式引擎,确保能支持节点筛选 xmlConfig.setExpressionEngine(new XPathExpressionEngine()); // 如果你用的是CombinedConfiguration,找到对应的XMLConfiguration源 // 比如遍历mCombinedConfig的所有配置源,找到XML类型的那个 for (Configuration config : mCombinedConfig.getConfigurations()) { if (config instanceof XMLConfiguration) { ((XMLConfiguration) config).setExpressionEngine(new XPathExpressionEngine()); break; } }
步骤2:获取server01的完整配置
// 获取id为server01的单个server节点的配置(假设id唯一) Configuration server01Config = mCombinedConfig.configurationAt("company/server[id='server01']"); // 现在你可以像操作普通配置一样获取server01下的内容了 // 比如获取该服务器下所有应用的客户名称 List<String> allClientsOnServer01 = server01Config.getList("app.client"); for (String client : allClientsOnServer01) { System.out.println("Server01上的客户实例:" + client); } // 或者获取某个特定客户的端口号 String clientAPort = server01Config.getString("app[client='clientA'].port"); System.out.println("Server01上clientA的端口:" + clientAPort);
方法2:遍历所有server节点筛选
如果你不想用XPath,也可以遍历所有server节点,手动筛选出id为server01的:
// 获取所有server节点的配置列表 List<Configuration> allServers = mCombinedConfig.configurationsAt("company.server"); Configuration server01Config = null; for (Configuration server : allServers) { if ("server01".equals(server.getString("id"))) { server01Config = server; break; } } // 后续操作同方法1 if (server01Config != null) { // 处理server01的配置 }
注意事项
- 如果你用的是Commons Configuration 2.x版本,确保依赖里包含
commons-configuration2和commons-jxpath(XPath支持需要这个) - 如果你的XML节点名称有特殊字符,XPath表达式需要适当转义
- 当使用CombinedConfiguration时,要注意组合配置的优先级,确保你读取的是正确的XML配置源
内容的提问来源于stack exchange,提问作者fancyJaneDo
相关产品推荐
相关产品推荐

