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

如何将Apache Commons Configuration插值查找分隔符改为空格?

解决Apache Commons Configuration插值分隔符替换问题

要将Apache Commons Configuration的插值分隔符从默认的:改为空格,适配${encoded 21$%Ds}这种格式,只需自定义表达式引擎并替换默认实现即可,具体步骤如下:

1. 自定义表达式引擎

继承DefaultExpressionEngine,重写变量解析逻辑,将第一个空格作为Lookup名称与参数的分隔符:

import org.apache.commons.configuration2.interpol.DefaultExpressionEngine;

public class SpaceSeparatedExpressionEngine extends DefaultExpressionEngine {
    @Override
    protected String[] extractVariable(String var) {
        // 定位第一个空格的位置,分割Lookup名称和参数
        int spacePos = var.indexOf(' ');
        if (spacePos > 0) {
            return new String[]{
                var.substring(0, spacePos),
                var.substring(spacePos + 1)
            };
        }
        // 无空格时按默认逻辑处理
        return super.extractVariable(var);
    }
}

2. 配置自定义引擎并注册Lookup

将自定义表达式引擎设置到配置实例,同时注册你的解码Lookup:

// 假设config是你的Configuration实例
config.setExpressionEngine(new SpaceSeparatedExpressionEngine());

// 注册解码Lookup
ConfigurationInterpolator interpolator = config.getInterpolator();
interpolator.registerLookup("encoded", new DecodeLookup());

3. 修正Lookup实现

注意原代码中的类名BogisLookup是笔误,修正为DecodeLookup并实现解码逻辑:

import org.apache.commons.configuration2.interpol.Lookup;

public class DecodeLookup implements Lookup {
    @Override
    public Object lookup(String varName) {
        return decode(varName);
    }

    // 自定义解码逻辑,示例为URL解码
    private String decode(String encoded) {
        try {
            return java.net.URLDecoder.decode(encoded, "UTF-8");
        } catch (java.io.UnsupportedEncodingException e) {
            throw new RuntimeException("解码失败", e);
        }
    }
}

这样配置后,框架解析${encoded 21$%Ds}时,会自动将encoded作为Lookup名称,21$%Ds作为参数传入DecodeLookup完成解码,无需重写getProperty()方法,完全贴合框架扩展机制。

内容的提问来源于stack exchange,提问作者Lukas Weber

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:32:36