You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:23:51