Apache Velocity:验证上下文中的所有变量是否都存在于速度模板中

Apache Velocity: Verify if all variables in a context are present in velocity template

提问人:tuk 提问时间:6/16/2023 最后编辑:Arpita Shrivastavatuk 更新时间:6/18/2023 访问量:134

问:

是否可以在 Apache Velocity 1.7 中检查 中指定的所有键是否对模板有效?例如,假设我有一个模板,如下所示:VelocityContextcard.vm

card {
    type: CREDIT
    company: VISA
    name: "${firstName} ${lastName}"
}

如果我随后执行以下代码,它应该会抛出一个错误,因为模板中不存在:cardNumbercard.vm

VelocityContext context = new VelocityContext();
context.put("firstName", "tuk");
context.put("lastName", "man");
context.put("cardNumber", "1234");
StringWriter writer = new StringWriter();
t.merge(context, writer);
Java Apache 速度

评论


答:

0赞 mkienenb 6/18/2023 #1

正如 Christopher 在 velocity 邮件列表上提到的,您始终可以创建 VelocityContext 的子类来自定义这样的行为。

例如,这将跟踪哪些键已放入上下文中,并跟踪在上下文中使用了哪些键。然后,在合并模板后调用 context.checkForUnreferencedValues()。

您可能需要自定义代码,具体取决于哪些帮助程序对象正在向上下文添加键,以及您是否重用它。

    static class ReferenceCountingVelocityContext extends VelocityContext {
        private Set<String> keysToCheck = new HashSet<>();
        private Set<String> keysUsed = new HashSet<>();

        @Override
        public Object put(String key, Object value) {
            keysToCheck.add(key);
            return super.put(key, value);
        }

        @Override
        public Object get(String key) {
            keysUsed.add(key);
            return super.get(key);
        }
        public void checkForUnreferencedValues() throws UnusedVelocityContextKeyException {
            if (!keysToCheck.containsAll(keysUsed)) {
                throw new UnusedVelocityContextKeyException();
            }
        }
    }