如何将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
相关产品推荐
相关产品推荐

